BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示
说在前面
最近使用自己的数据集对bert-base-uncased进行了二次预训练,只使用了MLM任务,发现在加载训练好的模型进行输出CLS表示用于下游任务时,同一个句子的输出CLS表示都不一样,并且控制台输出以下警告信息。说是没有这些权重。
Some weights of BertModel were not initialized from the model checkpoint at ./model/test-model and are newly initialized: ['bert.pooler.dense.bias', 'bert.pooler.dense.weight']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.BertModel 的某些权重在 ./model/test-model 的模型检查点时未被初始化,现在是新初始化的: ['bert.pooler.dense.bias','bert.pooler.dense.weight']。
您可能应该在下流任务中训练该模型,以便将其用于预测和推理。
问题原因
我刚开始获取CLS token表示使用的是以下方式,池化后的CLS token表示。
# 获取池化后的[CLS] token 表示
pooler_output = outputs.pooler_output
但是我使用的模型是以下加载方式,它的输出并不包含 pooler_output
,因为这个模型是为 掩码语言模型(Masked Language Model)任务设计的,而不是用于分类任务。因此,模型的输出包括 last_hidden_state
,而不包括 pooler_output
。
model = AutoModelForMaskedLM.from_pretrained(BERT_PATH).to('cuda')
# 或者
model = BertForMaskedLM.from_pretrained(BERT_PATH).to('cuda')
所以我加载使用训练后的模型总是对同一个句子的CLS输出总是变化,就是没有pooler_output层的权重参数,它加载模型推理时自己随机初始化了pooler_output层权重参数。
解决方法
一共有两个解决方法。
1. 直接使用
last_hidden_state[:,0,:]获取每个句子的cls token的表示。缺点:cls 表示在句子级表示方面差于
pooler_output表示。
2. 修改训练的模型架构,添加池化层。
pooler_output表示的
优点是它对[CLS]
token 的表示进行了池化处理,它通常是更好的句子级别表示。
1. BERT模型的输出格式探究
last_hidden_state
last_hidden_state
:这是一个张量,形状为 [batch_size, sequence_length, hidden_size]
。
batch_size
:一次传入模型的样本数。sequence_length
:输入序列的长度(即输入文本中的 token 数量)。hidden_size
:每个 token 的隐藏状态向量的维度,通常是 768(BERT-base)或 1024(BERT-large)。
形象生动图形
真实示例
以下是1个batch_size的真实数据,每一行就是一个token,共有512行。每行里面的数值共有768个。该last_hidden_state
的形状是 [1, 512, 768]
last_hidden_state: tensor([[[-0.1043, 0.0966, -0.2970, ..., -0.3728, 0.2120, 0.5492],[ 0.0131, -0.0778, 0.0908, ..., -0.1869, 1.0111, 0.1027],[-0.8840, 0.3916, 0.3881, ..., -0.5864, 0.3374, 0.1069],...,[-0.2845, -0.8075, 0.6715, ..., -0.5281, 0.5046, -0.6814],[-0.4623, -0.6836, -0.8556, ..., 0.1499, 0.1142, 0.0486],[ 0.5701, -0.1264, -0.2348, ..., 0.2635, -0.4314, -0.1724]]])
2. 获取每个句子的CLS token向量表示
last_hidden_state[:, 0, :]的含义=CLS向量表示
:
表示我们选择了所有的批次样本。batch_size
为 1 时,选择所有样本,即[1, 512, 768]
中的所有样本。0
:表示我们选择了每个句子序列中的第一个 token(索引 0),在 BERT 中,输入序列的第一个 token 通常是[CLS]
token。因此,0
索引指向[CLS]
token 对应的隐藏状态。:
表示我们选择了所有的隐藏维度(即每个 token 的隐藏状态),也就是每个 token 的向量表示,通常为 768 维(对于 BERT-base)。
因此该操作的含义是:每个句子有512个token,提取每个句子里面的第1个token向量,人话说就是每个句子的的第1个token向量就是每个句子的CLS向量表示。
结果:这将会返回一个形状为 [1, 768]
的张量,它包含了 [CLS]
token 的表示。由于 batch_size=1
,最终的张量只有一个样本。
为什么last_hidden_state[:, 0, :]提取的就是每个句子的CLS token表示呢?
在 BERT 模型中,[CLS]
token 是一个特殊的 token,通常用于表示整个句子的嵌入(embedding),特别是在分类任务中,[CLS]
token 的输出被用作整个输入句子的向量表示。
- 在 分类任务 中(如情感分析、文本分类等),通常使用 [CLS] token 的表示 作为整个句子的特征向量输入到分类器中。
- 在 其他任务 中(如命名实体识别、问答系统等),
[CLS]
token 的表示也常常被用作输入的高层特征。
3. last_hidden_state 和 pooler_output的含义区别
outputs.last_hidden_state
和 outputs.pooler_output
是 BERT 模型的两个重要输出,二者之间有明显的区别。它们分别代表了不同层级的模型输出,具体如下:
outputs.last_hidden_state
-
定义:
last_hidden_state
是 BERT 模型中每一层的输出,包含了模型对于输入文本中每个 token 的隐藏表示。 -
形状:
last_hidden_state
的形状通常是[batch_size, sequence_length, hidden_size]
,即:batch_size
:批次中样本的数量。sequence_length
:输入序列(即文本)的长度,通常是 token 的个数(包括[CLS]
和[SEP]
token)。hidden_size
:每个 token 的隐藏状态向量的维度(通常是 768,对于bert-base-uncased
)。
-
用途:
last_hidden_state
是 BERT 对每个 token 的表示,包含了输入文本中每个 token 在其上下文中被表示出来的隐藏状态。它包含了完整的上下文信息。例如,对于输入文本 "Hello, how are you?",
last_hidden_state
包含了"Hello"
、","
、"how"
等每个 token 的上下文嵌入(表示)。你可以根据这个输出提取每个 token 的表示或使用[CLS]
token 的表示(last_hidden_state[:, 0, :]
)作为整个句子的表示。
outputs.pooler_output
- 定义:
pooler_output
是一个经过额外处理的 [CLS] token 的表示。BERT 的pooler
是一个简单的全连接层,它接收last_hidden_state
中[CLS]
token 的输出,然后对其进行处理(通常是通过一个tanh
激活函数)以得到一个句子级别的特征表示。 - 形状:
pooler_output
的形状通常是[batch_size, hidden_size]
,即:batch_size
:批次中的样本数。hidden_size
:每个样本的pooler_output
的维度(通常是 768)。
- 用途:
pooler_output
是 [CLS] token 的经过进一步处理后的表示,通常用于分类任务中。pooler_output
是通过对last_hidden_state
中[CLS]
token 的输出应用池化操作(通常是tanh
激活函数)得到的最终句子级别的表示。这个表示通常用于下游任务,如分类任务。
两者的区别
-
last_hidden_state
:- 是 BERT 的每个 token 的 上下文表示。它是来自模型的 所有 token 的输出,形状为
[batch_size, sequence_length, hidden_size]
。 - 它包含了对输入文本中每个 token 的隐藏状态表示,可以通过它提取每个 token(包括
[CLS]
)的表示。
- 是 BERT 的每个 token 的 上下文表示。它是来自模型的 所有 token 的输出,形状为
-
pooler_output
:- 仅包含 [CLS] token 的表示,并且是经过池化处理(通过
tanh
)后的结果,形状为[batch_size, hidden_size]
。 - 它通常用于 句子级别的表示,尤其在分类任务中,
pooler_output
是更常见的输入特征。
- 仅包含 [CLS] token 的表示,并且是经过池化处理(通过
何时使用哪一个?
last_hidden_state
:如果你需要每个 token 的表示(如进行命名实体识别、文本生成等任务),你应该使用last_hidden_state
。- 例如:对于文本分类任务中的 BERT 模型,你通常会使用
[CLS]
token 的last_hidden_state
来提取句子的表示,last_hidden_state[:, 0, :]
。
- 例如:对于文本分类任务中的 BERT 模型,你通常会使用
pooler_output
:如果你只是进行 句子级别的分类任务(如情感分析、文本分类等),通常会直接使用pooler_output
,因为它已经对[CLS]
token 的表示进行了处理,通常是更好的句子级别表示。- 例如:对于情感分析,你会使用
pooler_output
作为整个句子的向量表示进行分类。
- 例如:对于情感分析,你会使用
代码示例
假设你正在使用 BERT 模型进行文本分类,你可以使用以下代码来区分这两个输出:
import torch
from transformers import BertModel, BertTokenizer# 加载模型和分词器
model = BertModel.from_pretrained("bert-base-uncased")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")# 输入文本
text = "Hello, how are you?"# 编码文本
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)# 获取模型的输出
with torch.no_grad():outputs = model(**inputs)# 获取每个 token 的表示
last_hidden_state = outputs.last_hidden_state # [batch_size, sequence_length, hidden_size]# 获取[CLS] token 的表示(从 last_hidden_state 中提取)
cls_last_hidden = last_hidden_state[:, 0, :] # [batch_size, hidden_size]# 获取池化后的[CLS] token 表示
pooler_output = outputs.pooler_output # [batch_size, hidden_size]print("CLS token's last hidden state:", cls_last_hidden)
print("CLS token's pooler output:", pooler_output)
总结
last_hidden_state
:包含了每个 token 的 上下文表示,你可以用它来获取每个 token 的隐藏状态(包括[CLS]
)。pooler_output
:仅包含 [CLS] token 的表示,并且经过了池化处理,通常用于句子级别的任务,如文本分类。
4. 疑惑:pooler_output表示问题
我对bert进行了二次预训练后保存的模型输出发现并没有pooler_output权重参数(也就是文章开始处给出的警告信息),但是我又想要使用训练后的模型进行情感分析,我是直接使用lasthiddenstate的cls token表示呢,还是对其加一个池化处理呢?
cls_output = outputs.last_hidden_state[:, 0, :]
print(cls_output)pooler_output = outputs.pooler_output
print("pooler_output: ", pooler_output)
没有pooler_output权重参数的原因分析
因为我使用的是
BertForMaskedLM
模型,它的输出并不包含pooler_output
,因为这个模型是为 掩码语言模型(Masked Language Model)任务设计的,而不是用于分类任务。因此,模型的输出包括last_hidden_state
,而不包括pooler_output
。
解决方案
1. 直接使用 last_hidden_state[:, 0, :]
([CLS] token 的表示)
cls_representation = outputs.last_hidden_state[:, 0, :]
2. 对 [CLS]
token 的表示进行池化或全连接层处理
我觉得仅使用 CLS
token 的输出还不够,可以加一个简单的全连接层(例如,用 tanh
激活函数)来进一步池化或优化 CLS
token 的表示。
import torch.nn as nnclass SentimentAnalysisModel(nn.Module):def __init__(self, model):super(SentimentAnalysisModel, self).__init__()self.bert = modelself.fc = nn.Linear(768, 2) # 假设是二分类任务(情感分析)def forward(self, input_ids, attention_mask):outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)cls_rep = outputs.last_hidden_state[:, 0, :] # 获取 [CLS] token 的表示logits = self.fc(cls_rep) # 使用全连接层进行分类return logits# 使用训练后的模型来构建情感分析模型
sentiment_model = SentimentAnalysisModel(model)
在这个例子中,cls_rep
是 [CLS] token
的表示,之后我们将其传入一个全连接层进行二分类(情感分析)。当然,如果你有更多类别,你可以根据任务需要修改输出层。
总结
- 没有
pooler_output
:由于我使用的是BertForMaskedLM
,该模型的输出没有pooler_output
,但你可以使用last_hidden_state[:, 0, :]
(即[CLS]
token 的表示)作为句子级别的特征来进行情感分析。 - 是否加池化:我觉得仅使用
[CLS]
token 的表示不够好,可以加一个池化层或全连接层来进一步处理该表示,通常这种方式会提高分类性能。
因此,可以继续使用 last_hidden_state
中的 [CLS] token
作为情感分析的特征,如果需要提高模型效果,可以尝试在其基础上加一个池化层或全连接层。
5. 修改模型加载器方法探究
有没有其他解决方法呢,让我二次预训练后的模型有pooler_output。可以修改模型加载器吗,但是我使用的是MLM任务来二次预训练bert模型。我的训练任务是对bert模型进行二次预训练。
为了在训练后的 BERT 模型中有 pooler_output
,需要稍作修改,因为默认的 BertForMaskedLM
模型并不包含 pooler_output
(该输出通常用于分类任务的 BERT 模型,例如 BertForSequenceClassification
)。因此,可以通过修改模型的架构来实现这一目标。
解决方案:修改模型架构
在加载模型时,选择使用 BertModel
或继承 BertForMaskedLM
的新模型,并手动添加一个池化层(如全连接层)。这种方法允许继续使用 MLM 任务,同时为分类任务提供所需的 pooler_output
。
修改代码的步骤
第一步:继承 BertForMaskedLM
并添加 pooler_output
:
- 修改
BertForMaskedLM
模型,使其输出pooler_output
。 - 可以通过添加一个全连接层来模拟池化过程。
class BertWithPoolerOutput(BertForMaskedLM):def __init__(self, config):super().__init__(config)# 定义pooler层self.pooler = torch.nn.Linear(config.hidden_size, config.hidden_size)self.tanh = torch.nn.Tanh()# 使用BertModel来获得last_hidden_stateself.bert = BertModel(config)def forward(self, input_ids=None, attention_mask=None, token_type_ids=None, labels=None):# 使用BertModel来获取last_hidden_statebert_outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask,token_type_ids=token_type_ids)last_hidden_state = bert_outputs.last_hidden_state # 获取last_hidden_state# 提取[CLS]的输出cls_token_representation = last_hidden_state[:, 0, :] # 获取[CLS] token的表示# 通过池化层(全连接层)进行处理pooler_output = self.tanh(self.pooler(cls_token_representation))# 获取BERT的MaskedLM输出lm_outputs = super().forward(input_ids=input_ids, attention_mask=attention_mask,token_type_ids=token_type_ids, labels=labels)# 返回字典,包含loss, logits, pooler_outputreturn {'loss': lm_outputs.loss,'logits': lm_outputs.logits,'pooler_output': pooler_output}
在这个新类 BertWithPoolerOutput
中,我们继承了 BertForMaskedLM
,并增加了一个池化层 (self.pooler
) 和激活函数(tanh
),用于生成 pooler_output
。此修改确保在进行二次预训练时仍然可以使用池化后的表示。为了正确获取 last_hidden_state
,我们应该调用 BertModel
来获取 last_hidden_state
,而不是直接从 BertForMaskedLM
获取。
第2步:加载并训练这个模型:
通过这种方式,加载并训练模型时,模型将返回 pooler_output
,就可以使用它进行情感分析或其他分类任务。
from transformers import BertTokenizer, Trainer, TrainingArguments
from datasets import load_dataset
from transformers import DataCollatorForLanguageModeling# 训练和数据集代码保持不变,只是模型加载部分更换为我们自定义的模型
tokenizer = BertTokenizer.from_pretrained(BERT_PATH)
model = BertWithPoolerOutput.from_pretrained(BERT_PATH) # 使用我们自定义的模型# 其余的训练部分和数据处理代码不变
第三步:在训练过程中使用 pooler_output
:
训练结束后,模型将返回 pooler_output
,你可以直接使用它进行分类任务。
# 假设输出为 `outputs`,你可以访问 `pooler_output`
pooler_output = outputs.pooler_output
总结
- 可以通过 自定义模型 来为
BertForMaskedLM
添加pooler_output
,方法是在原有的BertForMaskedLM
上增加一个池化层。 - 这样,模型仍然可以用于 MLM 任务,同时也能输出
pooler_output
,而它通常是更好的句子级别表示,便于后续情感分析等任务。 - 训练完成后,就能使用
pooler_output
,它是通过池化[CLS]
token 的表示得到的句子级别的特征。
相关文章:
BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示
说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练,只使用了MLM任务,发现在加载训练好的模型进行输出CLS表示用于下游任务时,同一个句子的输出CLS表示都不一样,并且控制台输出以下警告信息。说是没有这些权重。…...
InfluxDB 集成 Grafana
将InfluxDB集成到Grafana进行详细配置通常包括以下几个步骤:安装与配置InfluxDB、安装与配置Grafana、在Grafana中添加InfluxDB数据源以及创建和配置仪表板。以下是一个详细的配置指南: 一、安装与配置InfluxDB 下载与安装: 从InfluxDB的官…...
Vue跨标签通讯(本地存储)(踩坑)
我司有一个需求【用户指引】 需求是根标签有一个用户指引总开关,可以控制页面所有的用户指引是否在页面进入后初始是否默认打开,但是有些页面会新开标签这就设计到跨标签通讯了 我采取的方案是本地存储 重点:首先本地存储在页面是同源(即域名协议端口三…...
掌握创意之钥:全面解析HTML5 Canvas
在数字时代,表达创意的方式多种多样,而 HTML5 中的 <canvas> 元素无疑为网页开发者提供了一个强大的工具箱。无论你是想要创建动态图表、互动游戏还是复杂的可视化应用,掌握 Canvas 的基本用法都是迈向成功的关键一步。本文将带你一步步…...
mac port 安装redis 并设置为系统服务 自定义配置方法
mac系统中,port 包管理工具比brew的速度快N倍,今天就给大家分享一下在macos系统中如何使用 port安装 redis数据库并配置为服务自动启动和自定义redis.conf配置的方法。 1. 安装redis sudo port install redis 2. 启动redis服务 sudo port load redis …...
Agent AI: Surveying the Horizons of Multimodal Interaction---摘要、引言、代理 AI 集成
题目 智能体AI:多模态交互视野的考察 论文地址:https://arxiv.org/abs/2401.03568 图1:可以在不同领域和应用程序中感知和行动的Agent AI系统概述。Agent AI是正在成为通用人工智能(AGI)的一个有前途的途径。Agent AI培训已经证…...
二百七十八、ClickHouse——将本月第一天所在的那一周视为第一周,无论它是从周几开始的,查询某个日期是本月第几周
一、目的 ClickHouse指标表中有个字段week_of_month,含义是这条数据属于本月第几周。 而且将本月第一天所在的那一周视为第一周,无论它是从周几开始的。比如2024-12-01是周日,即12月第一周。而2024-12-02是周一,即12月第二周 二…...
Unity 相机旋转及角度限制
前言 由于欧拉角具有直观的可读性,做相机旋转时选择修改eulerAngles 来实现旋转,但实际效果与预期稍有不同,这是因为欧拉角受到万向锁(Gimbal Lock)的影响,在赋值时需要对输入的角度进行调整。 if (value…...
基于CentOS系统利用Kamailio搭建企业级SIP服务器
一、Kamailio简介 Kamailio是一款开源的SIP服务器,具有高性能、可扩展、模块化等特点。它广泛应用于VoIP、即时通讯、视频会议等领域。Kamailio支持多种操作系统,如Linux、FreeBSD等,可以与其他开源项目(如 Asterisk、FreeSWITCH…...
部署项目报错
vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入,后端访问也正常,可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息:Error: Cannot find module ‘/v…...
【AIGC】大模型面试高频考点-位置编码篇
【AIGC】大模型面试高频考点-位置编码篇 (一)手撕 绝对位置编码 算法(二)手撕 可学习位置编码 算法(三)手撕 相对位置编码 算法(四)手撕 Rope 算法(旋转位置编码…...
钓鱼攻击详解:鱼叉攻击与水坑攻击
钓鱼攻击详解:鱼叉攻击与水坑攻击 在现代网络安全领域中,钓鱼攻击(Phishing)是一种最常见且有效的攻击手段。它通过欺骗用户,引导其泄露敏感信息或执行恶意操作,从而为攻击者打开大门。本文将深入介绍两种…...
如何在自动化安全测试中,实现多工具集成与数据融合,以提高对Spring Boot应用程序安全漏洞的检测效率与准确性?
为了在自动化安全测试中实现多工具集成与数据融合,以提高对Spring Boot应用程序安全漏洞的检测效率与准确性,可以采取以下策略和方法: 文章目录 1. 工具选择与集成2. 数据标准化与聚合3. 数据分析与融合4. 持续改进5. 实施示例 1. 工具选择与…...
框架篇面试
一、Spring框架中的单例bean的安全性 Spring框架中有一个Scope注解,默认的值就是singleton,单例的;因为一般在spring的bean中注入的都是无状态的对象,所以没有线程安全问题。但是如果在bean中定义了可修改的成员变量,…...
STM32滴答定时器SysTick理解+时基设置(4.1)
文章目录 1. 什么是滴答定时器?2. SysTick定时器初始化2.1 systick定时器时钟源?2.2 定时器四个寄存器 3 函数设置3.1SysTick_Config(uint32_t ticks)函数3.2初始化函数 4. 延时函数实现4.1 ms延时思路及实现4.2 us延时 1. 什么是…...
数字化时代下的企业合规管理:全球化背景下的挑战与机遇
在全球化浪潮的推动下,企业合规管理已成为企业发展中不可或缺的一部分。随着各国法规日益严格,以及数字化技术的飞速发展,企业在扩展业务的同时,也面临着越来越多的合规挑战。有效的合规管理不仅有助于提高企业的管理水平和运营效…...
读《Effective Java》笔记 - 条目17
条目17:使可变性最小化 为什么要使可变性最小化? 不可变对象天然是线程安全的,可以在多个线程之间安全共享。而可变对象需要添加额外的同步机制保证线程安全。不可变对象一旦创建就不会改变,便于追踪和理解代码。而可变对象的状态…...
对比json数据是否变化
在 JavaScript 中,你可以使用多种方法来对比两个 JSON 数据是否发生变化。以下是几种常见的方式: 1. 使用 JSON.stringify 最简单的方法是将两个 JSON 对象序列化为字符串,并比较这些字符串。但需要注意的是,这种方法对于对象属…...
云计算实验室建设方案
一、云计算实验室建设方案 云计算实验教学整体解决方案,包括:云计算服务器集群、云计算实训平台、实训课程体系、行业实战课程系统、行业数据等,系统性地解决云计算实训教学的痛点问题。 【硬件系统】云计算实训一体机 云计算实训一体机是唯…...
一、理论基础-PSI
之前参加了隐语第2期,对隐语SecretFlow框架有了大致的了解,这次参加隐语第4期,学习下PSI和PIR。 一、PSI定义 首先介绍PSI的定义,PSI(隐私集合求交,Private Set Intersection即PSI)是安全多方计算&#x…...
C++学习0.2: RAII
引用: 【代码质量】RAII在C编程中的必要性_raii 在c中的重要性-CSDN博客 C RAII典型应用之lock_guard和unique_lock模板_raii lock-CSDN博客 前言: 常用的线程间同步/通信(IPC)方式有锁(互斥锁、读写锁、自旋锁)、…...
机器学习基础
了解机器学习的基本概念,如监督学习、无监督学习、强化学习、模型评估指标(准确率、召回率、F1分数等)。 机器学习(Machine Learning,ML)是人工智能(AI)的一个分支,它使计…...
传输层TCP_三次握手四次挥手的过程
三次握手四次挥手 三次握手 三次握手...
AI主流的生成式工作流框架
根据搜索结果,以下是一些2024年比较主流的生成式工作流框架: 1. LangChain:LangChain是一个用于构建生成式AI工作流的开发框架,它支持多种语言模型、工具、数据源及其他系统的集成。 2. DSPy:DSPy是一个生成式AI工作…...
【WRF后处理】WRF时区(UTC)需转化为北京时间(CST)!!!
目录 WRF运行时间标准注意事项-本地时区问题 输入数据:ERA5时间标准ERA5数据和WRF模型需要转换为北京时间!!!北京时间(CST)与协调世界时(UTC)的关系转换方法 参考 WRF运行时间标准 …...
Qt 2D绘图之五:图形视图框架的结构、坐标系统和框架间的事件处理与传播
参考文章链接: Qt 2D绘图之五:图形视图框架的结构和坐标系统 Qt 2D绘图之六:图形视图框架的事件处理与传播 图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们。但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动、…...
游戏引擎学习第34天
仓库:https://gitee.com/mrxiao_com/2d_game #这天内容比较多 开场介绍 游戏开发行业的基础是使用C和C编程,这是当今几乎所有游戏的开发标准。市面上广受欢迎的游戏,如《使命召唤》或《侠盗猎车手》,它们的底层代码和引擎几乎无一例外地采…...
深度学习笔记——模型压缩和优化技术(蒸馏、剪枝、量化)
本文详细介绍模型训练完成后的压缩和优化技术:蒸馏、剪枝、量化。 文章目录 1. 知识蒸馏 (Knowledge Distillation)基本概念工作流程关键技术类型应用场景优势与挑战优势挑战 总结 2. 权重剪枝 (Model Pruning)基本原理二分类1. 非结构化剪枝(Unstructur…...
[在线实验]-RabbitMQ镜像的下载与部署
镜像下载 docker的rabbitmq镜像资源-CSDN文库 加载镜像 docker load --input rabbitmq.tar 给镜像打标签 这里发现镜像名为none,需要给镜像重命名下 docker tag [镜像id] [新镜像名称]:[新镜像标签] docker tag ebaf409ffbe2 rabbitmq:management 运行镜像…...
Netty 入门应用:结合 Redis 实现服务器通信
在上篇博客中,我们了解了 Netty 的基本概念和架构。本篇文章将带你深入实践,构建一个简单的 Netty 服务端,并结合 Redis 实现一个数据存取的示例。在这个场景中,Redis 作为缓存存储,Netty 作为服务端处理客户端请求。通…...
推荐 编译器c++
网页型 https://www.acgo.cn/playground C 在线工具 | 菜鸟工具 AcWing - 在线题库 ZJYYC在线测评系统 少儿编程竞赛在线学习 登录 - JOYSKID 余博士教编程_酷哥OJ_酷哥爱编程_酷哥创客AI编程 登录 - Luogu Spilopelia 软件型 DEV-c Dev C软件下载...
【新品发布】ESP32-P4开发板 —— 启明智显匠心之作,为物联网及HMI产品注入强劲动力
核心亮点: ESP32-P4开发板,是启明智显精心打造的一款高性能物联网开发板。它专为物联网项目及HMI(人机界面)产品而设计,旨在为您提供卓越的性能和稳定可靠的运行体验。 强大硬件配置: 双核400MHz RISC-V处…...
MeterSphere 使用脚本处理数据
1、前置/后置脚本 支持BeanShell(JSR223)、python、groovy、JavaScript脚本语言,推荐BeanShell(JSR223)。 在前置脚本中可以直接引用JMeter 预定义对象,例如: -- log:用于在脚本执行过程中打印日志 //打印“Hello World!”到info…...
如何获取谷歌新闻API密钥?
在信息获取和新闻传播领域,快速获取最新的新闻动态至关重要。谷歌新闻API为开发者提供了强大的工具,能够方便地集成全球各类新闻内容。通过使用该API,开发者可以实现对新闻的实时访问和管理,为用户提供丰富的信息服务。本文将指导…...
【全网最新】若依管理系统基于SpringBoot的前后端分离版本开发环境配置
目录 提前准备: 下载源代码 设置依赖 设置后台连接信息 运行后台 运行前端 安装npm依赖 启动前端 登录网页客户端 提前准备: 1、安装mysql 5以上就可以。 2、安装redis. 3、安装npm npm下载地址:https://nodejs.org/dist/v22.12…...
备赛蓝桥杯--算法题目(3)
1. 2的幂 231. 2 的幂 - 力扣(LeetCode) class Solution { public:bool isPowerOfTwo(int n) {return n>0&&n(n&(-n));} }; 2. 3的幂 326. 3 的幂 - 力扣(LeetCode) class Solution { public:bool isPowerOfT…...
如何解决 java.nio.charset.CoderMalfunctionError: 编码器故障错误问题?亲测有效的解决方法!
java.nio.charset.CoderMalfunctionError 是一个在 Java 中相对较少遇到的异常,通常与字符编码转换过程中的错误有关。当 Java 程序在进行字符编码转换时,遇到无法处理的字符或编码故障时,就会抛出该异常。 1. 问题描述 java.nio.charset.C…...
电气自动化 基于PLC控制的四路抢答器设计
摘要 本文描述了一款用三菱FX3U-48M可编程控制器设计的四路抢答器的系统构成、设计思路和功能。此抢答系统除了有基本抢答功能之外,还有计时、计算得分、亮灯提提示以及蜂鸣提醒功能。程序中设定答题时间,在主持人未按下开始抢答按钮之前,选…...
GA优化后的RBF神经网络
遗传算法(Genetic Algorithm, GA)优化后的RBF(Radial Basis Function)神经网络是一种结合进化算法与神经网络的混合模型,用于改进RBF神经网络的性能。以下是该模型的基本原理和相关公式: clear all close a…...
Scala:正则表达式
object test03 {//正则表达式def main(args: Array[String]): Unit {//定义一个正则表达式//1.[ab]:表示匹配一个字符,或者是a,或者是b//2.[a-z]:表示从a到z的26个字母中的任意一个//3.[A-Z]:表示从A到Z的26个字母中的任意一个//4.[0-9]:表示从0到9的10…...
vulnhub靶场之【hacksudo】1.0.1
前言 靶机:hacksudo 192.168.1.45 攻击:kali 192.168.1.16 都是虚拟机环境,桥接模式 主机发现 使用netdiscover或者arp-scan -l扫描 netdiscover -r 192.168.1.1/24信息收集 使用nmap扫描 因为看到2222是ssh服务,所以又扫…...
第4章:颜色和背景 --[CSS零基础入门]
在 CSS 中,颜色和背景属性是用于美化网页元素的重要工具。你可以通过多种方式定义颜色,并且可以设置元素的背景颜色、图像、渐变等。以下是关于如何在 CSS 中使用颜色和背景的一些关键点和示例。 1.颜色表示法 当然!以下是使用不同颜色表示…...
Python实现PBKDF2_SHA256加密密码
加密保存格式:pbkdf2_sha256$迭代次数$盐$哈希值 admin可能的结果:pbkdf2_sha256$10000$yzsusUJwrGfonwZzVxlnA$vgf/OgLf5C4wtQLtfNY9d68Hhxgv8eqZ0mwfxCqqeU import os import hashlib import base64 def password_encrypt(password, saltNone, iterations1000…...
React第十三节开发中常见问题之(视图更新、事件处理)
一、视图更新有哪些方案? 1、对于数据变量 正常的增删改查,只会让数据更新,但是不会触发 React 视图的更新; 如: <script lang"jsx">const baseTable [{name:Andy, age: 18, id: 1},{name:Jack, a…...
PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具
PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具 PyTorch 作为一个深度学习框架,以其灵活性、可扩展性和高效性广受欢迎。无论是在研究领域进行创新实验,还是在工业界构建生产级的深度学习模型,PyTorch 都能提供所需的工具和…...
Vue 3 中的计算属性(Computed Properties)详解
目录 Vue 3 中的计算属性(Computed Properties)详解 引言 什么是计算属性? 创建和使用计算属性 示例 1:基本用法 示例 2:带有 getter 和 setter 的计算属性 计算属性 vs 方法 Vue 3 中的计算属性(Co…...
RocketMQ 过滤消息 基于tag过滤和SQL过滤
RocketMQ 过滤消息分为两种,一种tag过滤,另外一种是复杂的sql过滤。 tag过滤 首先创建producer然后启动,在这里创建了字符串的数组tags。字符串数组里面放置了多个字符串,然后去发送15条消息。 15条消息随着i的增长,…...
AI开发: 知识图谱的初识,学会制作知识图谱- Python 机器学习
一、知识图谱的概念 知识图谱是一个通过图结构来表示和组织知识的工具,它将事物、概念和它们之间的关系以图的形式呈现出来,图中的节点代表实体(比如人物、地点、事件等),而边代表这些实体之间的各种关系(…...
windows系统的环境变量(系统变量)不能编辑可能是这个原因
有些电脑从开始菜单那搜索“环境变量”后是没法编辑系统变量的,只能从设置里面进”环境变量“来进行编辑。 可以观察到系统环境变量即便是点击到了,但还是无法进行编辑...
各种服务器使用 yum 安装 nginx
1. 在Red Hat Enterprise Linux (RHEL) 及其衍生版本(如CentOS, Oracle Linux, Rocky Linux, AlmaLinux)上安装Nginx的步骤如下: 安装前提条件 首先,确保系统已安装yum-utils工具,这将有助于管理软件包和仓库&#x…...