昇思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并加上雙向的結構,因此一定要熟練掌握TransformerEncoder的結構。

BERT模型的主要創新點都在pre-train方法上,即用了Masked Language ModelNext 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對話情緒識別的過程。主要包括環境配置、數據集下載、加載和預處理,模型構建和訓練、模型驗證、模型推理和模型泛化能力測試等方面。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40703.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js的作用域鏈

function test(){} 運行期上下文&#xff1a;當函數執行時&#xff0c;會創建一個稱為執行期上下文的內部對象。一個執行期上下文定義了一個函數執行時的環境&#xff0c;函數每次執行時對應的執行上下文都是 獨一無二的&#xff0c;所以多次調用一個函數對導致創建多個執行上下…

Linux 安裝pdfjam (PDF文件尺寸調整)

跟Ghostscript搭配使用&#xff0c;這樣就可以將不同尺寸的PDF調整到相同尺寸合并了。 在 CentOS 上安裝 pdfjam 需要安裝 TeX Live&#xff0c;因為 pdfjam 是基于 TeX Live 的。以下是詳細的步驟來安裝 pdfjam&#xff1a; ### 步驟 1: 安裝 EPEL 倉庫 首先&#xff0c;安…

springboot集成tika解析word,pdf,xls文件文本內容

介紹 Apache Tika 是一個開源的內容分析工具包&#xff0c;用于從各種文檔格式中提取文本和元數據。它支持多種文檔類型&#xff0c;包括但不限于文本文件、HTML、PDF、Microsoft Office 文檔、圖像文件等。Tika 的主要功能包括內容檢測、文本提取和元數據提取。 官網 https…

python入門詳細介紹

Python 是一種廣泛使用的高級編程語言&#xff0c;以其清晰的語法和代碼可讀性而聞名。它支持多種編程范式&#xff0c;包括面向對象、命令式、函數式和過程式編程。Python 由 Guido van Rossum 于1989年底發明&#xff0c;第一個公開發行版發行于1991年。 Python 的特點&…

java-初始化Map快捷裝數據

*單個Map創建 Map<String, String> stringStringMap Collections.singletonMap("reason", "同意");使用匿名類初始化Map List<Map<String,Object>> mapListnew ArrayList<>();mapList.add(new HashMap<String, Object>() {…

基于STM32F407ZG的FreeRTOS移植

1.從FreeRTOS官網中下載源碼 2、簡單分析FreeRTOS源碼目錄結構 2.1、簡單分析FreeRTOS源碼根目錄 &#xff08;1&#xff09;Demo&#xff1a;是官方為一些單片機移植FreeRTOS的例程 &#xff08;2&#xff09;License&#xff1a;許可信息 &#xff08;3&#xff09;Sourc…

《中國品牌網》揭秘格行品牌崛起之路:如何從混亂市場中殺出重圍,領跑未來?

在隨身WiFi行業亂象叢生的背景下&#xff0c;格行品牌憑借其獨特的經營理念和長期主義的精神&#xff0c;逐漸嶄露頭角&#xff0c;成為行業的領跑者。近日&#xff0c;《中國品牌網》記者專訪了格行品牌的創始人劉永先先生&#xff0c;就他的經營理念、市場策略以及未來展望進…

如何在 Odoo 16 中對 Many2Many 字段使用 Group by

Many2many 字段與 Many2one 字段類似,因為它們在模型之間建立了新的關系。在Odoo 16中,您無法按 many2many 字段分組,因為可以使用 many2many 記錄選擇任何記錄。當您使用 many2many 字段給出 group by 過濾器時,您將遇到斷言錯誤。 介紹如何在 Odoo 16 中使用 Many2Many…

AIGC | 為機器學習工作站安裝NVIDIA 4070 Ti Super顯卡驅動

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] 0x00 前言簡述 話接上篇《AIGC | Ubuntu24.04桌面版安裝后必要配置》文章&#xff0c;作為作者進行機器學習的基礎篇&#xff08;筑基期&#xff09;&#xff0c;后續將主要介紹機器學習環境之如何…

6-google::protobuf命名空間下常用的C++ API----repeated_field.h

#include <google/protobuf/repeated_field.h> namespace google::protobuf 所生成的協議消息類使用RepeatedField和RepeatedPtrField來操作重復字段。 這些類與STL的vector非常相似&#xff0c;但包含了許多優化&#xff0c;這些優化被發現特別適用于協議緩沖區的情況。…

【優化論】基本概念與細節

優化論&#xff08;Optimization Theory&#xff09;是數學和計算機科學中一個重要的分支&#xff0c;旨在尋找給定問題的最優解。這個領域的應用非常廣泛&#xff0c;從經濟學、工程學到機器學習、金融等各個領域都有其蹤跡。我們可以通過一系列直觀的比喻來理解優化論的基本概…

Python編譯器的選擇

了解如何使用一個集成開發環境&#xff08;IDE&#xff09;對于 Python 編程是非常重要的。IDE 提供了代碼編輯、運行、調試、版本控制等多種功能&#xff0c;可以極大地提升開發效率。以下是一些流行的 Python IDE 和代碼編輯器的介紹&#xff0c;以及如何開始使用它們&#x…

Python + 在線 + 文生音,音轉文(中文文本轉為英文語音,語音轉為中文文本)

開源模型 平臺&#xff1a;https://huggingface.co/ars-語言轉文本: pipeline("automatic-speech-recognition", model"openai/whisper-large-v3", device0 ) hf: https://huggingface.co/openai/whisper-large-v3 github: https://github.com/openai/wh…

kettle中調用restful接口時的SSL信任證書問題

1、找第三方獲取SSL證書&#xff0c;&#xff08;本案例為自簽名證書&#xff09; C:\Program Files\Java\jdk1.8.0_241\jre\lib\security>keytool -import -alias aliyun-maven -keystore cacerts -file E:\entSoftware\aliyun-maven.cer 輸入密鑰庫口令: …………一堆證…

ubuntu系統盤擴容

目錄 1 介紹 2 步驟 2.1 關閉虛擬機 2.2 編輯虛擬機設置 2.3 設置擴展大小 2.4 打開虛擬機 2.5 找到磁盤管理 2.6 擴展 1 介紹 本部分主要記述怎么給ubuntu系統盤擴展存儲容量&#xff0c;整個過程相對簡單&#xff0c;擴容方式輕松、容易。 2 步驟 2.1 關閉虛擬機 2…

前端面試題(CSS篇三)

一、簡單介紹使用圖片 base64 編碼的優點和缺點。 base64是一種圖片處理格式&#xff0c;通過特定的算法將圖片編碼為一長串字符串&#xff0c;在頁面顯示的時候&#xff0c;可以使用該字符串來代替圖片的url屬性。 使用base64的優點: 減少一個圖片的http請求 使用base64的缺點…

電腦f盤的數據回收站清空了能恢復嗎

隨著信息技術的飛速發展&#xff0c;電腦已成為我們日常生活和工作中不可或缺的設備。然而&#xff0c;數據的丟失或誤刪往往會給人們帶來極大的困擾。尤其是當F盤的數據在回收站被清空后&#xff0c;許多人會陷入絕望&#xff0c;認為這些數據已無法挽回。但事實真的如此嗎&am…

1071. 字符串的最大公因子

1071. 字符串的最大公因子 題目鏈接&#xff1a;1071. 字符串的最大公因子 代碼如下&#xff1a; class Solution { public:int gcd(int a,int b){return b0?a:gcd(b,a%b);}string gcdOfStrings(string str1, string str2) {if(str1str2!str2str1) {return ""…

WAIC 2024:科技界的搖滾狂歡,你錯過了什么?

大數據產業創新服務媒體 ——聚焦數據 改變商業 2024年7月5日&#xff0c;WAIC 2024舉辦的第二天。數據猿作為受邀媒體&#xff0c;在今天繼續親歷這一場關于未來的盛會。在這片匯聚了全球頂尖科技力量的舞臺上&#xff0c;見證了人工智能領域的最新成果&#xff0c;感受到了科…

雙人貪吃蛇代碼分享

一. snake.h #include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<stdbool.h> #include<locale.h> #include<time.h> #define Pos_x1 24 #define Pos_y1 5#define Pos_x2 24 #define Pos_y2 15 #define WALL L□#define …