昇思MindSpore 应用学习-基于 MindSpore 实现 BERT 对话情绪识别
基于 MindSpore 实现 BERT 对话情绪识别
模型简介
BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型语言模型。与BERT模型相似的预训练语言模型例如问答、命名实体识别、自然语言推理、文本分类等在许多自然语言处理任务中发挥着重要作用。模型是基于Transformer中的Encoder并加上双向的结构,因此一定要熟练掌握Transformer的Encoder的结构。
BERT模型的主要创新点都在pre-train方法上,即用了Masked Language Model和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。
在用Masked Language Model方法训练BERT的时候,随机把语料库中15%的单词做Mask操作。对于这15%的单词做Mask操作分为三种情况:80%的单词直接用[Mask]替换、10%的单词直接替换成另一个新的单词、10%的单词保持不变。
因为涉及到Question Answering (QA) 和 Natural Language Inference (NLI)之类的任务,增加了Next Sentence Prediction预训练任务,目的是让模型理解两个句子之间的联系。与Masked Language Model任务相比,Next Sentence Prediction更简单些,训练的输入是句子A和B,B有一半的几率是A的下一句,输入这两个句子,BERT模型预测B是不是A的下一句。
BERT预训练之后,会保存它的Embedding table和12层Transformer权重(BERT-BASE)或24层Transformer权重(BERT-LARGE)。使用预训练好的BERT模型可以对下游任务进行Fine-tuning,比如:文本分类、相似度判断、阅读理解等。
对话情绪识别(Emotion Detection,简称EmoTect),专注于识别智能对话场景中用户的情绪,针对智能对话场景中的用户文本,自动判断该文本的情绪类别并给出相应的置信度,情绪类型分为积极、消极、中性。 对话情绪识别适用于聊天、客服等多个场景,能够帮助企业更好地把握对话质量、改善产品的用户交互体验,也能分析客服服务质量、降低人工质检成本。
下面以一个文本情感分类任务为例子来说明BERT模型的整个应用过程。
import os # 导入os模块,用于与操作系统交互import mindspore # 导入MindSpore深度学习框架
from mindspore.dataset import text, GeneratorDataset, transforms # 从mindspore.dataset导入文本处理和数据集相关的功能
from mindspore import nn, context # 从mindspore导入神经网络模块和上下文管理器from mindnlp._legacy.engine import Trainer, Evaluator # 导入MindNLP的训练和评估模块
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback # 导入用于模型保存和最佳模型回调的功能
from mindnlp._legacy.metrics import Accuracy # 导入准确率评估指标
代码解析
- 导入模块:
import os:引入操作系统相关功能,通常用于文件和路径操作。import mindspore:引入MindSpore框架,提供深度学习的基础设施。from mindspore.dataset import text, GeneratorDataset, transforms:text:处理文本数据的功能模块。GeneratorDataset:可以通过生成器动态生成数据集。transforms:用于数据预处理和转换的工具。
from mindspore import nn, context:nn:包含神经网络构建所需的各类模块和层。context:用于设置MindSpore的运行环境和上下文配置。
from mindnlp._legacy.engine import Trainer, Evaluator:Trainer:用于模型的训练过程管理。Evaluator:用于评估模型性能的工具。
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback:CheckpointCallback:用于在训练过程中保存模型的回调。BestModelCallback:用于记录最佳模型的回调。
from mindnlp._legacy.metrics import Accuracy:引入准确率计算的指标模块。
API 解析
- mindspore.dataset:
- 该模块提供了用于处理数据集的工具,支持文本数据的加载和转换。
- mindspore.nn:
- 提供构建神经网络的基础组件,如层、损失函数等。
- mindspore.context:
- 用于设置运行环境,例如选择计算设备(CPU/GPU/Ascend)。
- mindnlp._legacy.engine:
- 提供训练和评估框架,可以简化模型的训练流程。
- mindnlp._legacy.engine.callbacks:
- 提供回调机制,帮助用户在训练过程中实现模型保存、学习率调整等功能。
- mindnlp._legacy.metrics:
- 提供性能评估指标,如准确率等,帮助在训练和评估阶段监测模型表现。
Building prefix dict from the default dictionary … Loading model from cache /tmp/jieba.cache Loading model cost 1.019 seconds. Prefix dict has been built successfully.
# prepare dataset
class SentimentDataset:"""Sentiment Dataset"""def __init__(self, path):self.path = path # 存储数据集的路径self._labels, self._text_a = [], [] # 初始化标签和文本列表self._load() # 调用加载数据集的方法def _load(self):# 从指定路径加载数据集with open(self.path, "r", encoding="utf-8") as f:dataset = f.read() # 读取数据集文件内容lines = dataset.split("\n") # 按行分割数据for line in lines[1:-1]: # 遍历每一行,跳过第一行和最后一行label, text_a = line.split("\t") # 按制表符分割标签和文本self._labels.append(int(label)) # 将标签转换为整数并添加到标签列表self._text_a.append(text_a) # 将文本添加到文本列表def __getitem__(self, index):# 根据索引返回标签和文本return self._labels[index], self._text_a[index]def __len__(self):# 返回数据集的大小return len(self._labels)
代码解析
- 类定义:
class SentimentDataset:定义一个用于情感分析的数据集类,主要用于加载和提供数据。
- 初始化方法:
def __init__(self, path):self.path = path:将数据集文件路径存储到实例变量中。self._labels, self._text_a = [], []:初始化两个空列表,用于存储标签和文本数据。self._load():调用私有方法_load来加载数据。
- 数据加载方法:
def _load(self):with open(self.path, "r", encoding="utf-8") as f:以只读模式打开数据集文件,指定编码为UTF-8。dataset = f.read():读取文件内容。lines = dataset.split("\n"):将文件内容按行切割。for line in lines[1:-1]:循环遍历每行数据,跳过第一行(通常是表头)和最后一行(可能为空行)。label, text_a = line.split("\t"):将每行数据按制表符分割,获取标签和文本。self._labels.append(int(label)):将标签转换为整数并添加到_labels列表。self._text_a.append(text_a):将文本添加到_text_a列表。
- 索引获取方法:
def __getitem__(self, index):根据给定的索引返回对应的标签和文本。return self._labels[index], self._text_a[index]:返回标签和文本的元组。
- 长度获取方法:
def __len__(self):返回数据集中样本的数量。return len(self._labels):返回标签列表的长度。
API 解析
__init__:构造函数,用于初始化类的实例,并设置初始状态。- 文件读取:使用Python内置的
open函数来读取文件内容,通过with语句确保文件在使用后正确关闭。 - 列表操作:使用列表的
append方法动态添加数据。 __getitem__** 和 **__len__:这两个方法是Python的数据模型方法,允许类的实例像列表一样被索引和测量长度,使得SentimentDataset类可以很方便地与其他数据处理库(如PyTorch或MindSpore)配合使用。
数据集
这里提供一份已标注的、经过分词预处理的机器人聊天数据集,来自于百度飞桨团队。数据由两列组成,以制表符(‘\t’)分隔,第一列是情绪分类的类别(0表示消极;1表示中性;2表示积极),第二列是以空格分词的中文文本,如下示例,文件为 utf8 编码。
label–text_a
0–谁骂人了?我从来不骂人,我骂的都不是人,你是人吗 ?
1–我有事等会儿就回来和你聊
2–我见到你很高兴谢谢你帮我
这部分主要包括数据集读取,数据格式转换,数据 Tokenize 处理和 pad 操作。
# download dataset
!wget https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz -O emotion_detection.tar.gz
# 使用wget命令从指定URL下载情感检测数据集并保存为emotion_detection.tar.gz!tar xvf emotion_detection.tar.gz
# 解压下载的tar.gz文件,提取内容
代码解析
- 下载数据集:
!wget https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz -O emotion_detection.tar.gz:!wget:使用shell命令wget下载文件。https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz:指定要下载的数据集的URL。-O emotion_detection.tar.gz:将下载的文件保存为emotion_detection.tar.gz。
- 解压文件:
!tar xvf emotion_detection.tar.gz:!tar:使用shell命令tar来处理归档文件。xvf:这是tar命令的选项:x:表示解压缩。v:表示显示解压缩过程中的文件(verbose模式)。f:表示后面跟的是文件名。
emotion_detection.tar.gz:要解压的文件名。
API 解析
wget:- 一个用于从网络下载文件的命令行工具,支持 HTTP、HTTPS 和 FTP 协议。
tar:- 用于打包和解压缩文件的命令行工具,常用于Linux和Unix系统。
.tar.gz格式是经过gzip压缩的tar档案,结合了两种工具的优点。
- 用于打包和解压缩文件的命令行工具,常用于Linux和Unix系统。
注意事项
- 在执行上述命令时,确保你的环境支持
!前缀的shell命令,这通常在Jupyter Notebook或某些支持魔法命令的环境中有效。 - 下载和解压的操作需要网络连接,并且保存路径需要有写入权限。
数据加载和数据预处理
新建 process_dataset 函数用于数据加载和数据预处理,具体内容可见下面代码注释。
import numpy as np # 导入NumPy库,用于数值计算和操作def process_dataset(source, tokenizer, max_seq_len=64, batch_size=32, shuffle=True):# 获取当前设备目标,判断是否为Ascendis_ascend = mindspore.get_context('device_target') == 'Ascend'column_names = ["label", "text_a"] # 定义数据集的列名# 创建生成器数据集dataset = GeneratorDataset(source, column_names=column_names, shuffle=shuffle)# 定义类型转换操作type_cast_op = transforms.TypeCast(mindspore.int32)def tokenize_and_pad(text):# 根据设备类型进行分词和填充操作if is_ascend:# 在Ascend上进行填充和截断tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)else:# 在非Ascend设备上只进行分词tokenized = tokenizer(text)return tokenized['input_ids'], tokenized['attention_mask'] # 返回输入ID和注意力掩码# 数据集映射操作,应用分词和填充函数dataset = dataset.map(operations=tokenize_and_pad, input_columns="text_a", output_columns=['input_ids', 'attention_mask'])# 为标签应用类型转换dataset = dataset.map(operations=[type_cast_op], input_columns="label", output_columns='labels')# 批处理数据集if is_ascend:dataset = dataset.batch(batch_size) # 在Ascend上使用常规批处理else:dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id),'attention_mask': (None, 0)}) # 在非Ascend上使用填充批处理return dataset # 返回处理后的数据集
代码解析
- 导入:
import numpy as np:导入NumPy库,通常用于数值运算,但在此代码中未直接使用。
- 函数定义:
def process_dataset(source, tokenizer, max_seq_len=64, batch_size=32, shuffle=True):source:数据源,可以是文本文件、数据集对象等。tokenizer:用于将文本转换为模型输入格式的分词器。max_seq_len:设置文本的最大序列长度,超过该长度的文本将被截断。batch_size:每个批次的样本数量。shuffle:是否在生成数据集时打乱数据顺序。
- 设备判断:
is_ascend = mindspore.get_context('device_target') == 'Ascend':判断当前执行环境是否为Ascend设备。
- 数据集创建:
column_names = ["label", "text_a"]:定义数据集中包含的列名。dataset = GeneratorDataset(source, column_names=column_names, shuffle=shuffle):创建一个生成器数据集。
- 类型转换操作:
type_cast_op = transforms.TypeCast(mindspore.int32):创建一个类型转换操作,将标签转换为32位整数。
- 分词和填充:
def tokenize_and_pad(text):定义一个内部函数用于对输入文本进行分词和填充。tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len):在Ascend设备上进行分词,填充到最大长度。- 返回分词后的
input_ids和attention_mask。
- 数据集映射:
dataset = dataset.map(...):将文本列应用分词和填充操作,同时将标签列应用类型转换操作。
- 批处理:
if is_ascend:根据设备类型选择合适的批处理方式。dataset.batch(batch_size):在Ascend设备上使用常规批处理。dataset.padded_batch(batch_size, pad_info=...):在其他设备上使用填充批处理,指定填充值。
- 返回数据集:
return dataset:返回处理后的数据集对象。
API 解析
- GeneratorDataset:MindSpore中的一个数据集类,允许用户通过生成器动态生成数据。
- map:数据集的映射方法,可以对每个样本应用给定的操作。
- TypeCast:用于将数据类型转换为指定类型的操作。
- batch / padded_batch:用于将数据集分成批次,支持标准批处理和填充批处理,以处理不同长度的输入。
昇腾NPU环境下暂不支持动态Shape,数据预处理部分采用静态Shape处理:
from mindnlp.transformers import BertTokenizer # 导入BertTokenizer类,用于加载和使用BERT分词器# 从预训练的BERT模型加载分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') # 获取分词器的填充标记ID
tokenizer.pad_token_id # 创建训练数据集,使用自定义的SentimentDataset类和分词器
dataset_train = process_dataset(SentimentDataset("data/train.tsv"), tokenizer)# 创建验证数据集
dataset_val = process_dataset(SentimentDataset("data/dev.tsv"), tokenizer)# 创建测试数据集,禁用打乱
dataset_test = process_dataset(SentimentDataset("data/test.tsv"), tokenizer, shuffle=False)# 获取训练数据集的列名称
dataset_train.get_col_names() # 从训练数据集中获取一个迭代器并打印下一个样本
print(next(dataset_train.create_tuple_iterator()))
代码解析
- 导入分词器:
from mindnlp.transformers import BertTokenizer:从MindNLP库导入BERT分词器的类。
- 加载预训练的BERT分词器:
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese'):- 使用指定的模型名称加载预训练的BERT分词器,这里是中文BERT模型。
- 获取填充标记ID:
tokenizer.pad_token_id:获取分词器的填充标记的ID,用于后续的填充操作。
- 创建数据集:
dataset_train = process_dataset(SentimentDataset("data/train.tsv"), tokenizer):- 创建训练数据集,使用自定义的
SentimentDataset类,将数据集路径和分词器传入。
- 创建训练数据集,使用自定义的
dataset_val = process_dataset(SentimentDataset("data/dev.tsv"), tokenizer):- 创建验证数据集。
dataset_test = process_dataset(SentimentDataset("data/test.tsv"), tokenizer, shuffle=False):- 创建测试数据集,并设置
shuffle=False以保持数据顺序。
- 创建测试数据集,并设置
- 获取列名称:
dataset_train.get_col_names():调用方法获取训练数据集中列的名称,通常是标签和文本列。
- 创建迭代器并打印样本:
print(next(dataset_train.create_tuple_iterator())):- 创建一个迭代器,使用
next()获取下一个样本并打印出来,通常返回的是一个元组,包含标签和分词后的文本。
- 创建一个迭代器,使用
API 解析
- BertTokenizer:
- 用于处理BERT模型的文本输入,负责将文本转换为模型可以接受的ID格式,并执行必要的填充和截断。
- from_pretrained:
- 类方法,用于加载预训练模型的分词器,支持多种语言和任务。
- pad_token_id:
- 分词器的填充标记ID,通常用于处理不同长度的输入,确保输入形状一致。
- SentimentDataset:
- 自定义的数据集类,用于从指定文件加载情感分析相关的数据。
- process_dataset:
- 处理数据集的函数,执行分词、填充和批处理等操作,返回已处理的数据集。
- create_tuple_iterator:
- 数据集的方法,用于创建一个迭代器,可以返回数据集中的样本。
- next():
- Python内置函数,用于获取迭代器的下一个值。
模型构建
通过 BertForSequenceClassification 构建用于情感分类的 BERT 模型,加载预训练权重,设置情感三分类的超参数自动构建模型。后面对模型采用自动混合精度操作,提高训练的速度,然后实例化优化器,紧接着实例化评价指标,设置模型训练的权重保存策略,最后就是构建训练器,模型开始训练。
from mindnlp.transformers import BertForSequenceClassification, BertModel # 导入BERT模型和用于序列分类的特定模型
from mindnlp._legacy.amp import auto_mixed_precision # 导入自动混合精度的工具# 设置BERT配置并定义训练参数
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3)
# 从预训练的BERT模型加载序列分类模型,设置输出标签数量为3model = auto_mixed_precision(model, 'O1')
# 应用自动混合精度以提高训练性能,'O1'为混合精度的优化策略optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5)
# 创建Adam优化器,设置学习率为2e-5,并将模型可训练参数作为优化目标metric = Accuracy() # 定义准确率作为评估指标# 定义回调函数以保存检查点
ckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='bert_emotect', epochs=1, keep_checkpoint_max=2)
# 创建检查点回调,设置保存路径、检查点名称、保存频率和最大保留检查点数量best_model_cb = BestModelCallback(save_path='checkpoint', ckpt_name='bert_emotect_best', auto_load=True)
# 创建最优模型回调,自动加载最佳模型# 创建训练器
trainer = Trainer(network=model, train_dataset=dataset_train,eval_dataset=dataset_val, metrics=metric,epochs=5, optimizer=optimizer, callbacks=[ckpoint_cb, best_model_cb]) %%time # 记录训练时间# 开始训练
trainer.run(tgt_columns="labels")
代码解析
- 导入必要的库:
from mindnlp.transformers import BertForSequenceClassification, BertModel:导入MindNLP中的BERT序列分类模型。from mindnlp._legacy.amp import auto_mixed_precision:导入混合精度训练工具,以优化模型训练的性能和内存使用。
- 模型创建:
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3):- 从预训练的中文BERT模型加载一个用于序列分类的模型,设置标签数量为3(例如,情感分析中的三种情感)。
- 混合精度训练:
model = auto_mixed_precision(model, 'O1'):- 应用自动混合精度以节省内存和加速训练,其中 ‘O1’ 是适用于混合精度训练的优化策略。
- 优化器定义:
optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5):- 使用Adam优化器,学习率设为2e-5,优化目标是模型的可训练参数。
- 指标定义:
metric = Accuracy():- 定义准确率作为模型评估的指标。
- 定义回调:
ckpoint_cb = CheckpointCallback(...):- 创建检查点回调,以便在训练过程中定期保存模型检查点,设置保存路径、名称和最大检查点数量。
best_model_cb = BestModelCallback(...):- 创建最佳模型回调,以自动加载保存的最佳模型。
- 训练器创建:
trainer = Trainer(...):- 初始化训练器,传入模型、训练数据集、验证数据集、评估指标、训练周期、优化器和回调列表。
- 时间记录:
%%time:在Jupyter Notebook中使用魔法命令记录代码块的执行时间。
- 开始训练:
trainer.run(tgt_columns="labels"):- 开始模型的训练过程,指定目标列为标签列。
API 解析
- BertForSequenceClassification:
- BERT模型的变体,专门用于序列分类任务,能够处理文本分类任务的输入。
- auto_mixed_precision:
- 用于自动应用混合精度训练,结合使用不同的数据类型以提高训练效率。
- nn.Adam:
- Adam优化器,常用于深度学习中的参数优化。
- Accuracy:
- 评估指标类,用于计算模型的准确率。
- CheckpointCallback:
- 回调类,用于在训练过程中保存模型检查点。
- BestModelCallback:
- 回调类,用于自动保存和加载最佳模型。
- Trainer:
- MindSpore中用于管理整个训练过程的类,负责模型训练和评估的实施。
- run:
- 启动训练过程的方法,传入训练所需的参数。
模型验证
将验证数据集加再进训练好的模型,对数据集进行验证,查看模型在验证数据上面的效果,此处的评价指标为准确率。
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
# 创建评估器,传入训练好的模型、测试数据集和评估指标evaluator.run(tgt_columns="labels")
# 运行评估,指定目标列为标签列
代码解析
- 创建评估器:
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric):- 使用训练好的模型、测试数据集和指定的评估指标初始化评估器。
network=model:传入已经训练好的模型。eval_dataset=dataset_test:传入要评估的测试数据集。metrics=metric:传入评估所使用的指标(如准确率)。
- 运行评估:
evaluator.run(tgt_columns="labels"):- 调用评估器的
run方法开始评估过程,使用tgt_columns="labels"指定要评估的目标列为标签列。
- 调用评估器的
API 解析
- Evaluator:
- 用于评估模型性能的类,能够帮助用户在特定数据集上计算和输出模型的评估指标。
- run:
- 方法用于执行评估过程,通常会输出评估结果和性能指标,比如准确率、F1分数等。
- tgt_columns:
- 指定在评估过程中需要关注的标签列,通常是模型预测的目标列。
模型推理
遍历推理数据集,将结果与标签进行统一展示。
# 加载待预测数据集
dataset_infer = SentimentDataset("data/infer.tsv") def predict(text, label=None):label_map = {0: "消极", 1: "中性", 2: "积极"} # 定义标签映射# 将输入文本进行分词并转换为Tensor格式text_tokenized = Tensor([tokenizer(text).input_ids]) # 使用模型进行预测logits = model(text_tokenized) # 获取预测标签(取最大值的索引作为预测结果)predict_label = logits[0].asnumpy().argmax() # 格式化输出信息info = f"inputs: '{text}', predict: '{label_map[predict_label]}'" if label is not None:info += f" , label: '{label_map[label]}'" # 如果提供真实标签,则输出真实标签print(info) # 打印信息# 遍历待预测数据集并进行预测
for label, text in dataset_infer:predict(text, label)
代码解析
- 加载待预测数据集:
dataset_infer = SentimentDataset("data/infer.tsv"):- 从指定的文件路径加载待预测的数据集,这里是
infer.tsv文件。
- 从指定的文件路径加载待预测的数据集,这里是
- 定义预测函数:
def predict(text, label=None)::- 定义一个
predict函数,接受文本输入和可选的真实标签。
- 定义一个
- 标签映射:
label_map = {0: "消极", 1: "中性", 2: "积极"}:- 创建一个字典,将数值标签映射到对应的情感描述。
- 文本分词和转换:
text_tokenized = Tensor([tokenizer(text).input_ids]):- 使用提前定义的分词器对输入文本进行分词,并将生成的ID转换成Tensor格式,以便输入到模型中。
- 模型预测:
logits = model(text_tokenized):- 将分词后的文本输入到已训练的模型中获取预测结果(logits)。
- 获取预测标签:
predict_label = logits[0].asnumpy().argmax():- 从模型输出的logits中获取预测标签,通过取最大值的索引(
argmax())来确定最可能的情感类别。
- 从模型输出的logits中获取预测标签,通过取最大值的索引(
- 格式化输出信息:
info = f"inputs: '{text}', predict: '{label_map[predict_label]}'":- 创建一个包含输入文本和预测结果的字符串。
if label is not None:语句用于检查是否提供了真实标签,如果有,则将真实标签添加到输出信息中。
- 打印信息:
print(info):输出格式化的信息到控制台。
- 遍历数据集并进行预测:
for label, text in dataset_infer::- 遍历待预测的数据集
dataset_infer,对于每一对(label, text),调用predict函数进行预测。
- 遍历待预测的数据集
API 解析
- SentimentDataset:
- 自定义的数据集类,用于加载情感分析任务的输入数据。
- Tensor:
- MindSpore中的数据结构,用于存储和处理多维数据,尤其是在深度学习中作为输入或输出。
- tokenizer:
- 分词器实例,负责将文本转换为模型可以接受的ID格式。
- model:
- 已训练的情感分类模型,用于对输入文本生成预测结果。
- logits:
- 模型的输出,通常是每个类别的未归一化的得分,使用
argmax()获取预测标签。
- 模型的输出,通常是每个类别的未归一化的得分,使用
- argmax():
- NumPy中的函数,用于返回数组中最大值的索引,在此用来确定最可能的情感类别。
自定义推理数据集
自己输入推理数据,展示模型的泛化能力。
predict("家人们咱就是说一整个无语住了 绝绝子叠buff")
相关文章:
昇思MindSpore 应用学习-基于 MindSpore 实现 BERT 对话情绪识别
基于 MindSpore 实现 BERT 对话情绪识别 模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型语言模型。与BERT模型相似的预训练语言模…...
【初阶数据结构篇】顺序表和链表算法题
文章目录 顺序表算法题移除元素删除有序数组中的重复项合并两个有序数组 链表算法题移除链表元素反转链表链表的中间结点合并两个有序链表链表分割链表的回文结构 顺序表算法题 不熟悉顺序表的可以先了解一下 顺序表实现方法 移除元素 给你一个数组 nums 和一个值 val&#x…...
使用weex进行APP混合开发
Weex 是一个用于构建高性能原生应用的框架,它使用 Vue.js 的语法和组件模型,允许开发者使用 HTML、CSS 和 JavaScript 来编写应用,同时能够编译成原生应用。Weex 主要由阿里巴巴集团开发,并且已经被多个公司采用。 下面是使用 We…...
C++stl大根堆/小根堆的创建与记忆
priority_queue<int, vector<int>, greater<int>> heap; 这行代码在 C 中声明了一个优先队列 heap,其元素类型为 int,使用 vector<int> 作为其底层容器,并且指定了 greater<int> 作为比较函数对象。 这里的关…...
visual studio性能探测器使用案列
visual studio性能探测器使用案列 在visual studio中,我们可以使用自带的工具对项目进行性能探测,具体如下 1.选择性能探查器 Vs2022/Vs2019中打开方式: Vs2017打开方式: 注意最好将解决方案配置为:Release Debu…...
redis的代码开发
redis是什么? 前提:官网地址https://redis.io 1.Redis是一个开源的,key,value格式的,内存型数据结构存储系统;它可用作数据库、缓存和消息中间件。 value支持多种类型的数据结构如strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglo…...
嗷呜,就问你接不接?
...
避免过拟合,参数大模型强,正则让模型不要走偏
1、加入惩罚项L1【绝对值】 和L2【默认 平方】,降低噪音的影响,减少权重W的值 2、丢弃法 层与层之间加入噪音,只能在全连接层使用 无偏差加入噪音 p为丢弃的概率 x 当概率p是0 否则为除以(1-p) 丢弃概率p 一般为0.1 0.5 def drop_out(x…...
vue+element-ui的列表查询条件/筛选条件太多以下拉选择方式动态添加条件(支持全选、反选、清空)
1、此功能已集成到TQueryCondition组件中 2、最终效果 3、具体源码(新增moreChoose.vue) <template><el-popoverpopper-class"t_query_condition_more":bind"popoverAttrsBind"ref"popover"v-if"allcheckList.length>0"…...
LLM的训练与推断
LLM的训练与推断 目前比较流行的大模型一般都是自回归模型。在推理时,它类似于RNN,每次计算下一个token的概率。也就是说,如果除去最开始的输入情况下,最终推理长度为n的话,就需要计算n次。但是训练却是并行化的。 在…...
uniapp使用WebSocket uniapp使用WebSocket Uniapp整合WebSocket uniapp使用 websocket
uniapp使用WebSocket uniapp使用WebSocket Uniapp整合WebSocket uniapp使用 websocket 前言1、Socket.js2、main.js引入3、组件中调用 前言 代码中的示例只在 H5、APP环境下成功运行,小程序环境下如果无效,需要使用预编译 - 条件性的编译,适…...
SSH Exporter:基于Prometheus的远程系统性能监控神器
SSH Exporter English | 中文 介绍 SSH Exporter 是一个基于 Prometheus 规范的监控工具,通过 SSH 协议远程收集目标服务器的系统性能数据,如 CPU 使用率、内存使用情况、磁盘和网络 I/O 等,并将这些数据暴露为 Prometheus 格式的 metrics…...
Docker基础概念
Docker 是一个流行的容器化平台,它使开发者能够打包他们的应用程序及其依赖项到一个轻量级、可移植的容器中。这有助于确保应用程序无论在哪里运行都能获得一致的结果。以下是 Docker 的几个基础概念的详细解释: 1. Docker 镜像 (Image) 定义: Docker …...
小白进阶为大神
编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?今天,我就来分享一下这方面的经验和知识…...
2024最新Python和PyCharm的安装教程
Python和PyCharm的安装教程如下: Python安装教程 一、下载Python安装包 访问Python官方网站:Welcome to Python.org。 点击页面上方的“Downloads”链接。 在下载页面,选择“Windows”系统(以Windows系统为例)&…...
数据库死锁:深入解析与应对策略
在数据库管理系统中,死锁是一个常见且棘手的问题,它可能导致系统性能下降、事务延迟甚至完全阻塞。本文将深入探讨数据库死锁的概念、产生原因、检测方法以及预防与解决策略,帮助读者更好地理解和应对这一挑战。 一、什么是数据库死锁&#…...
Python入门宝藏《看漫画学Python》,495页漫画带你弄清python知识点!简单易懂 | 附PDF全彩版
华为出品的《看漫画学Python》全彩PDF教程是一本适合Python初学者的学习资料,通过漫画的形式将复杂的Python技术问题简单化,使学习过程更加生动有趣。以下是对该教程的内容简介、本书概要及本书目录的详细解析: 内容简介 《看漫画学Python》…...
Webshell管理工具:AntSword(中国蚁剑)
中国蚁剑是一款开源的跨平台网站管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。 通俗的讲:中国蚁剑是 一 款比菜刀还牛的shell控制端软件。 一、中国蚁剑下载 1. 下载 AntSword-Loader https://github.com/AntSwordP…...
Java 中的File类
路径分为绝对路径和相对路径。 相对路径肯定是相对谁来说的,一般是一个文件相对于另外一个文件而言的路径。 下面是一个例子,比如index.htm如何找到photo.jpg呢? c:/website/web/index.htmc:/website/img/photo.jpg 所以在index.htm中使用…...
java将map转json字符串或者再将json字符串转回map,java将对象转json字符串或者互想转换,对象集合和json字符串互转
1.导入hutool工具依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>2.直接复制一下代码运行 import cn.hutool.json.JSONUtil;import java.util.Ar…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
java+webstock
maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...
