昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别
1. 基于MindSpore实现BERT对话情绪识别
1.1 环境配置
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14# 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行`!pip install mindnlp==0.3.1`
!pip install mindnlp
!pip show mindspore
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting mindnlp==0.3.1Downloading https://pypi.tuna.tsinghua.edu.cn/packages/72/37/ef313c23fd587c3d1f46b0741c98235aecdfd93b4d6d446376f3db6a552c/mindnlp-0.3.1-py3-none-any.whl (5.7 MB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.7/5.7 MB 18.8 MB/s eta 0:00:00a 0:00:01
...
Requirement already satisfied: tzdata>=2022.7 in /home/nginx/miniconda/envs/jupyter/lib/python3.9/site-packages (from pandas->datasets->mindnlp==0.3.1) (2024.1)
Building wheels for collected packages: jiebaBuilding wheel for jieba (setup.py) ... doneCreated wheel for jieba: filename=jieba-0.42.1-py3-none-any.whl size=19314459 sha256=9ddea89911261cc55a74d51c5bd604e293e2c08b73a29597c8fde9ed0dc8dfc7Stored in directory: /home/nginx/.cache/pip/wheels/1a/76/68/b6d79c4db704bb18d54f6a73ab551185f4711f9730c0c15d97
Successfully built jieba
Installing collected packages: sortedcontainers, sentencepiece, pygtrie, jieba, addict, xxhash, safetensors, regex, pytest, pyarrow-hotfix, pyarrow, multiprocess, multidict, ml-dtypes, hypothesis, fsspec, frozenlist, async-timeout, yarl, pyctcdecode, aiosignal, tokenizers, aiohttp, datasets, evaluate, mindnlpAttempting uninstall: pytestFound existing installation: pytest 8.0.0Uninstalling pytest-8.0.0:Successfully uninstalled pytest-8.0.0Attempting uninstall: fsspecFound existing installation: fsspec 2024.6.0Uninstalling fsspec-2024.6.0:Successfully uninstalled fsspec-2024.6.0
Successfully installed addict-2.4.0 aiohttp-3.9.5 aiosignal-1.3.1 async-timeout-4.0.3 datasets-2.20.0 evaluate-0.4.2 frozenlist-1.4.1 fsspec-2024.5.0 hypothesis-6.105.0 jieba-0.42.1 mindnlp-0.3.1 ml-dtypes-0.4.0 multidict-6.0.5 multiprocess-0.70.16 pyarrow-16.1.0 pyarrow-hotfix-0.6 pyctcdecode-0.5.0 pygtrie-2.5.0 pytest-7.2.0 regex-2024.5.15 safetensors-0.4.3 sentencepiece-0.2.0 sortedcontainers-2.4.0 tokenizers-0.19.1 xxhash-3.4.1 yarl-1.9.4
Name: mindspore
Version: 2.2.14
Summary: MindSpore is a new open source deep learning training/inference framework that could be used for mobile, edge and cloud scenarios.
Home-page: https://www.mindspore.cn
Author: The MindSpore Authors
Author-email: contact@mindspore.cn
License: Apache 2.0
Location: /home/nginx/miniconda/envs/jupyter/lib/python3.9/site-packages
Requires: asttokens, astunparse, numpy, packaging, pillow, protobuf, psutil, scipy
Required-by: mindnlp
1.2 模型简介
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模型的整个应用过程。
- 导入依赖
# 导入os模块,提供了一种方便的方式来使用操作系统相关的功能。
import os# 导入mindspore模块,这是一个面向AI的深度学习框架。
import mindspore# 从mindspore.dataset子模块中导入text、GeneratorDataset和transforms,这些都是用于数据处理的工具。
# text用于处理文本数据,GeneratorDataset用于创建自定义的数据集,transforms用于数据增强和预处理。
from mindspore.dataset import text, GeneratorDataset, transforms# 从mindspore模块中导入nn和context。
# nn是构建神经网络层的模块,context是用于设置运行环境的模块,如硬件设备、运行模式等。
from mindspore import nn, context# 从mindnlp._legacy.engine子模块中导入Trainer和Evaluator。
# Trainer是训练模型的类,Evaluator是评估模型的类。
from mindnlp._legacy.engine import Trainer, Evaluator# 从mindnlp._legacy.engine.callbacks子模块中导入CheckpointCallback和BestModelCallback。
# CheckpointCallback用于在训练过程中保存模型的权重,BestModelCallback用于保存评估结果最好的模型。
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback# 从mindnlp._legacy.metrics子模块中导入Accuracy,这是一个用于计算准确率的评估指标。
from mindnlp._legacy.metrics import Accuracy
输出:
Building prefix dict from the default dictionary ...
Dumping model to file cache /tmp/jieba.cache
Loading model cost 1.032 seconds.
Prefix dict has been built successfully.
大意为:
正在从默认词典构建前缀词典…
正在将模型转储到文件缓存 /tmp/jieba.cache
加载模型耗时1.032秒。
前缀词典已成功构建。
# 准备数据集
class SentimentDataset:"""情感数据集"""def __init__(self, path):self.path = path # 初始化数据集路径self._labels, self._text_a = [], [] # 初始化标签和文本列表self._load() # 调用加载函数def _load(self):# 以只读模式打开指定路径的文件,并指定编码为utf-8with 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):# 实现getitem方法,以便能够通过索引访问数据集的元素return self._labels[index], self._text_a[index] # 返回对应索引的标签和文本def __len__(self):# 实现len方法,以便能够获取数据集的大小return len(self._labels) # 返回标签列表的长度,即数据集的大小
1.3 数据集
这里提供一份已标注的、经过分词预处理的机器人聊天数据集,来自于百度飞桨团队。数据由两列组成,以制表符(‘\t’)分隔,第一列是情绪分类的类别(0表示消极;1表示中性;2表示积极),第二列是以空格分词的中文文本,如下示例,文件为 utf8 编码。
label–text_a
0–谁骂人了?我从来不骂人,我骂的都不是人,你是人吗 ?
1–我有事等会儿就回来和你聊
2–我见到你很高兴谢谢你帮我
这部分主要包括数据集读取,数据格式转换,数据 Tokenize 处理和 pad 操作。
# 使用wget命令从百度NLP的官方网站下载情感检测数据集的压缩文件
# 并将下载的文件重命名为emotion_detection.tar.gz
!wget https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz -O emotion_detection.tar.gz# 使用tar命令解压下载的emotion_detection.tar.gz文件
!tar xvf emotion_detection.tar.gz
输出:
--2024-07-04 23:28:31-- https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz
Resolving baidu-nlp.bj.bcebos.com (baidu-nlp.bj.bcebos.com)... 119.249.103.5, 113.200.2.111, 2409:8c04:1001:1203:0:ff:b0bb:4f27
Connecting to baidu-nlp.bj.bcebos.com (baidu-nlp.bj.bcebos.com)|119.249.103.5|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1710581 (1.6M) [application/x-gzip]
Saving to: ‘emotion_detection.tar.gz’emotion_detection.t 100%[===================>] 1.63M 10.9MB/s in 0.2s 2024-07-04 23:28:31 (10.9 MB/s) - ‘emotion_detection.tar.gz’ saved [1710581/1710581]data/
data/test.tsv
data/infer.tsv
data/dev.tsv
data/train.tsv
data/vocab.txt
1.3.1 数据加载和数据预处理
新建 process_dataset 函数用于数据加载和数据预处理,具体内容可见下面代码注释。
import numpy as np# 定义一个处理数据集的函数,它接受源数据、分词器、最大序列长度、批处理大小和是否打乱数据集的参数
def process_dataset(source, tokenizer, max_seq_len=64, batch_size=32, shuffle=True):# 判断当前设备是否为Ascend AI处理器is_ascend = mindspore.get_context('device_target') == 'Ascend'# 定义数据集中的列名column_names = ["label", "text_a"]# 创建一个生成器数据集,使用指定的列名和是否打乱数据集的参数dataset = GeneratorDataset(source, column_names=column_names, shuffle=shuffle)# 定义类型转换操作,将数据类型转换为mindspore.int32type_cast_op = transforms.TypeCast(mindspore.int32)# 定义一个函数,用于对文本进行分词和填充def tokenize_and_pad(text):# 如果是Ascend设备,则使用特定的分词参数if is_ascend:tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)else:tokenized = tokenizer(text)# 返回输入ID和注意力掩码return tokenized['input_ids'], tokenized['attention_mask']# 对数据集进行映射操作,应用分词和填充函数,并指定输入和输出列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')# 如果是Ascend设备,则直接批处理数据集if is_ascend:dataset = dataset.batch(batch_size)else:# 如果不是Ascend设备,则使用填充的批处理,并指定填充信息dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id),'attention_mask': (None, 0)})# 返回处理后的数据集return dataset
昇腾NPU环境下暂不支持动态Shape,数据预处理部分采用静态Shape处理:
# 从mindnlp.transformers模块中导入BertTokenizer类
from mindnlp.transformers import BertTokenizer# 使用BertTokenizer的from_pretrained静态方法创建一个分词器实例
# 该方法会根据预训练模型的名称加载预训练的权重和配置
# 在这个例子中,加载的是'bert-base-chinese'模型的分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
输出:
100%49.0/49.0 [00:00<00:00, 3.10kB/s]107k/0.00 [00:00<00:00, 103kB/s]263k/0.00 [00:00<00:00, 161kB/s]624/? [00:00<00:00, 62.9kB/s]
from_pretrained方法会从互联网上下载预训练的模型权重和配置,如果已经下载过,则会从本地缓存中加载。
tokenizer.pad_token_id
输出:
0
# 使用SentimentDataset类创建训练数据集,传入训练数据的路径
dataset_train = process_dataset(SentimentDataset("data/train.tsv"), tokenizer)# 使用SentimentDataset类创建验证数据集,传入验证数据的路径
dataset_val = process_dataset(SentimentDataset("data/dev.tsv"), tokenizer)# 使用SentimentDataset类创建测试数据集,传入测试数据的路径,并且指定shuffle参数为False,表示不进行数据打乱
dataset_test = process_dataset(SentimentDataset("data/test.tsv"), tokenizer, shuffle=False)# 调用dataset_train对象的get_col_names方法
# 这个方法会返回数据集中的列名列表
dataset_train.get_col_names()
输出:
['input_ids', 'attention_mask', 'labels']
# 调用dataset_train数据集的create_tuple_iterator()方法,创建一个元组迭代器
# 使用next()函数获取迭代器的下一个元素,即数据集中的第一个元素
# 并将该元素的内容打印出来,这将显示数据集中的一个样本,包括其特征和标签
print(next(dataset_train.create_tuple_iterator()))
输出:
[Tensor(shape=[32, 64], dtype=Int64, value=
[[ 101, 1914, 1568 ... 0, 0, 0],[ 101, 872, 812 ... 0, 0, 0],[ 101, 5314, 872 ... 0, 0, 0],...[ 101, 6929, 872 ... 0, 0, 0],[ 101, 1343, 6859 ... 0, 0, 0],[ 101, 2428, 677 ... 0, 0, 0]]), Tensor(shape=[32, 64], dtype=Int64, value=
[[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0],...[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0],[1, 1, 1 ... 0, 0, 0]]), Tensor(shape=[32], dtype=Int32, value= [2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 1])]
1.4 模型构建
通过 BertForSequenceClassification 构建用于情感分类的 BERT 模型,加载预训练权重,设置情感三分类的超参数自动构建模型。后面对模型采用自动混合精度操作,提高训练的速度,然后实例化优化器,紧接着实例化评价指标,设置模型训练的权重保存策略,最后就是构建训练器,模型开始训练。
# 从mindnlp.transformers模块中导入BertForSequenceClassification和BertModel类
from mindnlp.transformers import BertForSequenceClassification, BertModel# 从mindnlp._legacy.amp模块中导入auto_mixed_precision函数
from mindnlp._legacy.amp import auto_mixed_precision# 使用BertForSequenceClassification的from_pretrained静态方法加载预训练的BERT模型
# 指定num_labels参数为3,因为情感分类任务有3个标签
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3)# 使用auto_mixed_precision函数对模型进行自动混合精度训练
# 'O1'表示使用16位浮点数进行部分训练,以提高训练速度和减少内存消耗
model = auto_mixed_precision(model, 'O1')# 创建一个Adam优化器实例,传入模型的训练参数和学习率
# 学习率设置为2e-5,这是一个常见的BERT模型学习率
optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5)
输出:
The following parameters in checkpoint files are not loaded:
['cls.predictions.bias', 'cls.predictions.transform.dense.bias', 'cls.predictions.transform.dense.weight', 'cls.seq_relationship.bias', 'cls.seq_relationship.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.transform.LayerNorm.weight']
The following parameters in models are missing parameter:
['classifier.weight', 'classifier.bias']
模型有一堆参数没有加载…不知道是否影响…
# 创建一个Accuracy指标实例,用于评估模型的准确性
metric = Accuracy()# 定义用于保存检查点的回调函数
# CheckpointCallback将在每个epoch结束时保存检查点,并指定保存路径和检查点文件名
# keep_checkpoint_max参数指定最多保留的检查点文件数
ckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='bert_emotect', epochs=1, keep_checkpoint_max=2)# BestModelCallback将在验证集上评估模型性能,并在性能提升时保存最佳模型的检查点
# auto_load参数设置为True,表示在训练结束后自动加载最佳模型的检查点
best_model_cb = BestModelCallback(save_path='checkpoint', ckpt_name='bert_emotect_best', auto_load=True)# 创建一个Trainer实例,用于训练模型
# network参数指定要训练的模型
# train_dataset参数指定训练数据集
# eval_dataset参数指定验证数据集
# metrics参数指定评估模型性能的指标
# epochs参数指定训练的轮数
# optimizer参数指定优化器
# callbacks参数指定训练过程中使用的回调函数列表
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参数指定目标列名,即模型需要预测的标签列名
trainer.run(tgt_columns="labels")
输出:
The train will start from the checkpoint saved in 'checkpoint'.
Epoch 0: 100%302/302 [04:14<00:00, 2.11s/it, loss=0.34553832]
Checkpoint: 'bert_emotect_epoch_0.ckpt' has been saved in epoch: 0.
Evaluate: 100%34/34 [00:16<00:00, 3.44s/it]
Evaluate Score: {'Accuracy': 0.9083333333333333}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 0.---------------
Epoch 1: 100%302/302 [02:41<00:00, 1.91it/s, loss=0.19056101]
Checkpoint: 'bert_emotect_epoch_1.ckpt' has been saved in epoch: 1.
Evaluate: 100%34/34 [00:05<00:00, 6.80it/s]
Evaluate Score: {'Accuracy': 0.9611111111111111}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 1.---------------
Epoch 2: 100%302/302 [02:41<00:00, 1.91it/s, loss=0.12954864]
The maximum number of stored checkpoints has been reached.
Checkpoint: 'bert_emotect_epoch_2.ckpt' has been saved in epoch: 2.
Evaluate: 100%34/34 [00:04<00:00, 8.05it/s]
Evaluate Score: {'Accuracy': 0.9833333333333333}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 2.---------------
Epoch 3: 100%302/302 [02:41<00:00, 1.90it/s, loss=0.08371902]
The maximum number of stored checkpoints has been reached.
Checkpoint: 'bert_emotect_epoch_3.ckpt' has been saved in epoch: 3.
Evaluate: 100%34/34 [00:04<00:00, 7.65it/s]
Evaluate Score: {'Accuracy': 0.9916666666666667}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 3.---------------
Epoch 4: 100%302/302 [02:41<00:00, 1.91it/s, loss=0.06113353]
The maximum number of stored checkpoints has been reached.
Checkpoint: 'bert_emotect_epoch_4.ckpt' has been saved in epoch: 4.
Evaluate: 100%34/34 [00:04<00:00, 7.82it/s]
Evaluate Score: {'Accuracy': 0.9935185185185185}
---------------Best Model: 'bert_emotect_best.ckpt' has been saved in epoch: 4.---------------
Loading best model from 'checkpoint' with '['Accuracy']': [0.9935185185185185]...
---------------The model is already load the best model from 'bert_emotect_best.ckpt'.---------------
CPU times: user 23min 36s, sys: 13min 1s, total: 36min 37s
Wall time: 15min 51s
5轮训练后,准确率达到了99.35%(相对于训练数据集来说)
1.5 模型验证
将验证数据集加再进训练好的模型,对数据集进行验证,查看模型在验证数据上面的效果,此处的评价指标为准确率。
# 创建一个Evaluator实例,用于评估模型性能
# network参数指定要评估的模型
# eval_dataset参数指定评估数据集
# metrics参数指定评估模型性能的指标
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)# 使用Evaluator的run方法评估模型性能
# tgt_columns参数指定目标列名,即模型需要预测的标签列名
evaluator.run(tgt_columns="labels")
输出:
Evaluate: 100%33/33 [00:08<00:00, 1.26s/it]
Evaluate Score: {'Accuracy': 0.9063706563706564}
在验证数据集上的准确率为90.64%
1.6 模型推理
遍历推理数据集,将结果与标签进行统一展示。
# 创建一个SentimentDataset实例,用于推理数据
# 传入推理数据的路径
dataset_infer = SentimentDataset("data/infer.tsv")# 定义一个预测函数,接受文本和标签(可选)作为输入
def predict(text, label=None):# 定义一个标签映射字典,将标签ID转换为对应的标签名称label_map = {0: "消极", 1: "中性", 2: "积极"}# 使用tokenizer对文本进行分词,并将结果转换为Tensor# Tensor是一个用于存储多维数组的类text_tokenized = Tensor([tokenizer(text).input_ids])# 使用模型对文本进行预测,获取logitslogits = model(text_tokenized)# 获取预测标签,即logits中最大值的索引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)# 导入Tensor类,用于存储多维数组
from mindspore import Tensor# 遍历dataset_infer数据集,使用predict函数对每个文本进行预测
# 并打印预测结果
for label, text in dataset_infer:predict(text, label)
输出:
inputs: '我 要 客观', predict: '中性' , label: '中性'
inputs: 'KAO 你 真是 说 废话 吗', predict: '消极' , label: '消极'
inputs: '口嗅 会', predict: '中性' , label: '中性'
inputs: '每次 是 表妹 带 窝 飞 因为 窝路痴', predict: '中性' , label: '中性'
inputs: '别说 废话 我 问 你 个 问题', predict: '消极' , label: '消极'
inputs: '4967 是 新加坡 那 家 银行', predict: '中性' , label: '中性'
inputs: '是 我 喜欢 兔子', predict: '积极' , label: '积极'
inputs: '你 写 过 黄山 奇石 吗', predict: '中性' , label: '中性'
inputs: '一个一个 慢慢来', predict: '中性' , label: '中性'
inputs: '我 玩 过 这个 一点 都 不 好玩', predict: '消极' , label: '消极'
inputs: '网上 开发 女孩 的 QQ', predict: '中性' , label: '中性'
inputs: '背 你 猜 对 了', predict: '中性' , label: '中性'
inputs: '我 讨厌 你 , 哼哼 哼 。 。', predict: '消极' , label: '消极'
1.7 自定义推理数据集
自己输入推理数据,展示模型的泛化能力。
predict("家人们咱就是说一整个无语住了 绝绝子debuff")
predict("今天真是太倒霉了")
predict("今天天气不错")
输出:

2. 小结
本文主要介绍了用MindSpore实现BERT对话情绪识别的过程。主要包括环境配置、数据集下载、加载和预处理,模型构建和训练、模型验证、模型推理和模型泛化能力测试等方面。
相关文章:
昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别
1. 基于MindSpore实现BERT对话情绪识别 1.1 环境配置 # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…...
反向散射技术(backscatter communication)
智能反射表面辅助的反向散射通信系统研究综述(知网) 1 反向散射通信技术优势和应用场景 反向散射通信技术通过被动射频技术发送信号,不需要一定配有主动射频单元,被认为是构建绿色节能、低成本、可灵活部署的未来物联网规模化应用关键技术之一,是实现“…...
致远CopyFile文件复制漏洞
复现版本 V8.0SP2 漏洞范围 V5&G6_V6.1至V8.0SP2全系列版本、V5&G6&N_V8.1至V8.1SP2全系列版本。 漏洞复现 上传文件 POST /seeyon/ajax.do?methodajaxAction&managerNameportalCssManager&rnd57507 HTTP/1.1 Accept: */* Content-Type: applicatio…...
MySQL 创建数据库
MySQL 创建数据库 在当今的数据驱动世界中,数据库是任何应用程序的核心组成部分。MySQL,作为一个流行的开源关系数据库管理系统,因其可靠性、易用性和强大的功能而广受欢迎。本文将详细介绍如何在MySQL中创建数据库,包括基础知识和最佳实践。 什么是MySQL数据库? MySQL…...
AbyssFish单连通周期边界多孔结构2D软件
软件介绍 AbyssFish单连通周期边界多孔结构2D软件(以下简称软件)可用于生成具备周期性边界条件的单连通域多孔结构PNG图片,软件可设置生成模型的尺寸、孔隙率、孔隙尺寸、孔喉尺寸等参数,并且具备孔隙形态控制功能。 软件生成的…...
Linux驱动开发-03字符设备驱动框架搭建
一、字符设备驱动开发步骤 驱动模块的加载和卸载(将驱动编译模块,insmod加载驱动运行)字符设备注册与注销(我们的驱动实际上是去操作底层的硬件,所以需要向系统注册一个设备,告诉Linux系统,我有…...
Zynq系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTX高速接口,提供8套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB自研…...
VS2019使用C#写窗体程序技巧(1)
1、打开串口 private void button1_Click(object sender, EventArgs e){myPort cmb1.Text;mybaud Convert.ToInt32(cmb2.Text, 10);databit 8;parity Parity.None;stopBit StopBits.One;textBox9.Text "2";try{sp new SerialPort(myPort, mybaud, parity, dat…...
Python爬虫-requests模块
前戏: 1.你是否在夜深人静的时候,想看一些会让你更睡不着的图片却苦于没有资源... 2.你是否在节假日出行高峰的时候,想快速抢购火车票成功..。 3.你是否在网上购物的时候,想快速且精准的定位到口碑质量最好的商品. …...
适用于PyTorch 2.0.0的Ubuntu 22.04上CUDA v11.8和cuDNN 8.7安装指南
将下面内容保存为install.bash,直接用bash执行一把梭解决 #!/bin/bash### steps #### # verify the system has a cuda-capable gpu # download and install the nvidia cuda toolkit and cudnn # setup environmental variables # verify the installation ######…...
使用conda安装openturns
目录 1. 有效方法2. 整体分析使用pip安装使用conda安装验证安装安装过程中可能遇到的问题 1. 有效方法 conda install -c conda-forge openturns2. 整体分析 OpenTURNS是一个用于概率和统计分析的软件库,主要用于不确定性量化。你可以通过以下步骤在Python环境中安…...
Chameleon:动态UI框架使用详解
文章目录 引言Chameleon框架原理核心概念工作流程 基础使用安装与配置创建基础界面 高级使用自定义组件响应式布局数据流与状态管理 结论 引言 Chameleon,作为一种动态UI框架,旨在通过灵活、高效的方式帮助开发者构建跨平台、响应用户交互的图形用户界面…...
7.10飞书一面面经
问题描述 Redis为什么快? 这个问题我遇到过,但是没有好好总结,导致答得很乱。 答:Redis基于内存操作: 传统的磁盘文件操作相比减少了IO,提高了操作的速度。 Redis高效的数据结构:Redis专门设计…...
[数据结构] 归并排序快速排序 及非递归实现
()标题:[数据结构] 归并排序&&快速排序 及非递归实现 水墨不写bug (图片来源于网络) 目录 (一)快速排序 类比递归谋划非递归 快速排序的非递归实现: (二)归并排序 归…...
面试题 12. 矩阵中的路径
矩阵中的路径 题目描述示例 题解 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成࿰…...
钉钉扫码登录第三方
钉钉文档 实现登录第三方网站 - 钉钉开放平台 (dingtalk.com) html页面 将html放在 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>登录</title>// jquery<script src"http://code.jqu…...
多GPU系统中的CUDA设备不可用问题
我们在使用多GPU系统时遇到了CUDA设备不可用的问题,详细情况如下: 问题描述: 我们在一台配备有8块NVIDIA GeForce RTX 3090显卡的服务器上运行CUDA程序时,遇到了如下错误: cudaErrorDevicesUnavailable: CUDA-capabl…...
python的列表推导式
文章目录 前言一、解释列表推导式二、在这句代码中的应用三、示例四、使用 for 循环的等价代码总结 前言 看看这一行代码:questions [q.strip() for q in examples["question"]] ,问题是最外层的 中括号是做什么的? 最外层的中括…...
类与对象(2)
我们在了解了类的简单创建后,需要对类的创建与销毁有进一步的了解,也就是对于类的构造函数与析构函数的了解。 目录 注意: 构造函数的特性: 析构函数: 注意: 该部分内容为重难点内容,在正常…...
迂回战术:“另类“全新安装 macOS 15 Sequoia beta2 的极简方法
概述 随着 WWDC 24 的胜利闭幕,Apple 平台上各种 beta 版的系统也都“跃跃欲出”,在 mac 上自然也不例外。 本次全新的 macOS 15 Sequoia(红杉)包含了诸多重磅升级,作为秃头开发者的我们怎么能不先睹为快呢࿱…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
