【MindSpore學習打卡】應用實踐-LLM原理和實踐-基于MindSpore實現BERT對話情緒識別

在當今的自然語言處理(NLP)領域,情緒識別是一個非常重要的應用場景。無論是在智能客服、社交媒體分析,還是在情感計算領域,準確地識別用戶的情緒都能夠極大地提升用戶體驗和系統的智能化水平。BERT(Bidirectional Encoder Representations from Transformers)作為一種強大的預訓練語言模型,已經在多個NLP任務中展示了其卓越的性能。在這篇博客中,我們將詳細介紹如何基于MindSpore框架,利用BERT模型實現對話情緒識別。通過一步步的代碼示例和詳細解釋,幫助你掌握這一技術。

模型簡介

BERT(Bidirectional Encoder Representations from Transformers)是一種基于Transformer的雙向編碼器表征模型。它主要通過兩種預訓練任務來捕捉詞語和句子級別的表征:Masked Language Model(MLM)和Next Sentence Prediction(NSP)。

  • Masked Language Model:隨機將語料庫中15%的單詞進行掩碼操作,模型需要預測這些被掩碼的單詞。
  • Next Sentence Prediction:模型需要預測兩個句子之間是否存在順序關系。

BERT預訓練后,可以用于多種下游任務,如文本分類、相似度判斷、閱讀理解等。

數據集準備

在數據集準備部分,我們下載并解壓了百度飛槳團隊提供的機器人聊天數據集。這個數據集已經過預處理,并包含了情緒標簽。每一行數據由一個標簽和一個經過分詞處理的文本組成。標簽表示情緒類別(0表示消極,1表示中性,2表示積極),文本則是用戶的對話內容。通過使用這種結構化的數據,我們可以更方便地進行情感分類任務。

# 下載數據集
!wget https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz -O emotion_detection.tar.gz
!tar xvf emotion_detection.tar.gz

數據集格式如下:

label--text_a
0--誰罵人了?我從來不罵人,我罵的都不是人,你是人嗎 ?
1--我有事等會兒就回來和你聊
2--我見到你很高興謝謝你幫我

數據加載和預處理

數據加載和預處理是機器學習流程中至關重要的一步。我們使用了GeneratorDataset來加載數據,并通過映射操作將文本轉換為模型可以接受的格式。具體來說,我們使用了BertTokenizer將文本Tokenize成詞匯ID,并進行填充(Pad)操作。這樣做的目的是確保所有輸入序列的長度一致,從而提高訓練效率和模型性能。

import numpy as np
from mindspore.dataset import text, GeneratorDataset, transforms
from mindnlp.transformers import BertTokenizerdef process_dataset(source, tokenizer, max_seq_len=64, batch_size=32, shuffle=True):is_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:tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)else:tokenized = tokenizer(text)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')if is_ascend:dataset = dataset.batch(batch_size)else:dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id), 'attention_mask': (None, 0)})return datasettokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
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)

在這里插入圖片描述

模型構建

在模型構建部分,我們使用了BertForSequenceClassification來進行情感分類任務。這個預訓練模型已經在大規模語料上進行了訓練,具有強大的語言理解能力。通過加載預訓練權重,我們可以顯著提升模型在情感分類任務上的表現。同時,我們使用了自動混合精度(auto mixed precision)技術,這不僅可以加速訓練過程,還能減少顯存使用,從而在有限的硬件資源下實現更高效的訓練。

優化器和評價指標是模型訓練中的重要組件。我們選擇了Adam優化器,因為它在處理大規模數據和復雜模型時表現優異。評價指標方面,我們使用了準確率(Accuracy)來衡量模型的性能。通過這些設置,我們可以確保模型在訓練過程中不斷優化,并在驗證集上取得良好的表現。

回調函數在模型訓練過程中發揮著重要作用。我們設置了兩個回調函數:CheckpointCallbackBestModelCallback。前者用于定期保存模型的權重,后者則自動加載表現最好的模型權重。通過這些回調函數,我們可以確保在訓練過程中不會丟失重要的模型參數,并且始終使用表現最佳的模型進行推理和評估。

from mindnlp.transformers import BertForSequenceClassification
from mindspore import nn
from mindnlp._legacy.amp import auto_mixed_precisionmodel = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3)
model = auto_mixed_precision(model, 'O1')optimizer = nn.Adam(model.trainable_params(), learning_rate=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])
trainer.run(tgt_columns="labels")

模型驗證

在模型驗證部分,我們使用驗證數據集來評估模型的性能。通過計算模型在驗證集上的準確率,我們可以了解模型的泛化能力和實際效果。這一步驟非常重要,因為它可以幫助我們發現模型在訓練過程中可能存在的問題,并進行相應的調整和優化。

evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
evaluator.run(tgt_columns="labels")

模型推理

模型推理部分展示了如何使用訓練好的模型對新數據進行情感分類。我們定義了一個predict函數,通過輸入文本進行情感預測,并輸出預測結果。這個步驟展示了模型的實際應用能力,并驗證了模型的泛化性能。

dataset_infer = SentimentDataset("data/infer.tsv")def predict(text, label=None):label_map = {0: "消極", 1: "中性", 2: "積極"}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)

在這里插入圖片描述

自定義推理數據

最后,我們展示了如何使用模型對自定義輸入進行情感識別。這一步驟不僅展示了模型的實際應用能力,還驗證了模型在不同輸入下的表現。通過這種方式,我們可以進一步了解模型的泛化能力和實際效果。

predict("家人們咱就是說一整個無語住了 絕絕子疊buff")

在這里插入圖片描述

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

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

相關文章

imx6ull/linux應用編程學習(12)CAN應用編程基礎

關于裸機的can通信,會在其他文章發,這里主要講講linux上的can通信。 與I2C,SPI等同步通訊方式不同,CAN通訊是異步通訊,也就是沒有時鐘信號線來保持信號接收同步,也就是所說的半雙工,無法同時發送與接收&…

【Java 注解,自定義注解,元注解,注解本質,注解解析】

文章目錄 什么是注解?Java內置注解自定義注解元注解注解的本質注解解析 什么是注解? 注解是Java編程語言中的一種元數據,提供了有關程序的額外信息。注解以符號開始,緊跟著注解的名稱和一對括號,括號內包含注解的參數…

C++基礎篇(1)

目錄 前言 1.第一個C程序 2.命名空間 2.1概念理解 2.2namespace 的價值 2.3 namespace的定義 3.命名空間的使用 4.C的輸入輸出 結束語 前言 本節我們將正式進入C基礎的學習,話不多說,直接上貨!!! 1.第一個C程…

【Linux進階】文件系統8——硬鏈接和符號連接:ln

在Linux下面的鏈接文件有兩種, 一種是類似Windows的快捷方式功能的文件,可以讓你快速地鏈接到目標文件(或目錄);另一種則是通過文件系統的inode 鏈接來產生新文件名,而不是產生新文件,這種稱為硬鏈接&…

base SAS programming學習筆記10(combine data)

1.一對一合并 基本格式如下: data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的數據集,可以添加多個set 語句來實現上述的一對一合并) run; 輸出數據集結果如下: a.會包含所有輸入數據的變量名&#x…

小米手機永久刪除的照片怎么找回?這兩個方法千萬不要錯過!

小米手機永久刪除的照片怎么找回?身為米粉發燒黨的小編又雙叒叕手殘了!本來想在手機回收站中恢復一張照片,結果一個稀里糊涂就把照片點成了“永久刪除”。于是乎難得的休班假期,就變成了小編恢復永久刪除照片的漫漫之路。以下是小…

org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXXX的作用是什么?

org.springframework.boot.autoconfigure.EnableAutoConfigurationXXXXXXX 這一配置項在 Spring Boot 項目中的作用如下: 自動配置類的指定: 這一配置將 EnableAutoConfiguration 設置為 cn.geek.javadatamanage.config.DataManageAutoConfiguration&…

【2024_CUMCM】TOPSIS法(優劣解距離法)

目錄 引入 層次分析法的局限性 簡介 例子 想法1 想法2 運用實際分數進行處理 想法3 問題 擴展問題:增加指標個數 極大型指標與極小型指標 統一指標類型-指標正向化 標準化處理 計算公式 計算得分 對原公式進行變化 升級到m個指標和n個對象 代碼 …

系統分析師-基礎知識

基礎知識 一、計算機組成與結構1、計算機系統基礎知識1.1 計算機硬件組成1.2 中央處理單元(CPU)1.3 數據表示1.3.1 R進制轉十進制:1.3.2 十進制轉R進制: 1.4 校驗碼(3種校驗碼)1.4.1 基本知識1.4.2 奇偶校驗…

D-DPCC: Deep Dynamic Point Cloud Compression via 3D Motion Prediction

1. 論文基本信息 發布于: 2022 2. 創新點 首先提出了一種端到端深度動態點云壓縮框架(D-DPCC),用于運動估計、運動補償、運動壓縮和殘差壓縮的聯合優化。提出了一種新的多尺度運動融合(MMF)模塊用于點云幀間預測,該模塊提取和融合不同運動流…

首屆UTON區塊鏈開發者計劃大會在馬來西亞圓滿落幕

7月9日,首屆UTON區塊鏈開發者計劃大會在馬來西亞吉隆坡成功舉辦! 來自全球頂尖的行業領袖、技術精英和眾多區塊鏈愛好者參與了此次盛會,也標志著UTON區塊鏈生態進入了一個全新的發展階段。 會上,UTON區塊鏈創始人之一唐毅先生以“…

Python 中什么是遞歸函數,如何編寫遞歸函數?

遞歸是計算機科學中的一種基本概念,它指的是函數調用自身的編程技巧。在Python中,遞歸函數是一種通過調用自身來解決問題的函數。這種方法常用于解決可以被分解為較小相同問題的場景,例如階乘計算、斐波那契數列、全排列生成等。 一、遞歸的…

TCP 握手數據流

這張圖詳細描述了 TCP 握手過程中,從客戶端發送 SYN 包到服務器最終建立連接的整個數據流轉過程,包括網卡、內核、進程中的各個環節。下面對每個步驟進行詳細解釋: 客戶端到服務器的初始連接請求 客戶端發送 SYN 包: 客戶端發起…

添加點擊跳轉頁面,優化登錄和注冊頁路由

一、給注銷按鈕添加點擊跳轉至登錄頁 1、在路由中添加登錄頁路由 2、自定義登錄頁面 3、在app.vue頁面找到下拉框組件,添加點擊事件 4、使用vue-router中的useRoute和useRouter 點擊后可以跳轉,但是還存在問題,路徑這里如果我們需要更改登錄…

Linux——公網 IP別名設置,清屏,刪除別名,在linux中提供alias永久化的方法,命令歷史

#### ipe - 公網 IP別名設置: bash alias ipecurl ipinfo.io/ip [rootserver ~]# alias ipecurl ipinfo.io/ip [rootserver ~]# ipe 113.132.176.202[rootserver ~]# #### c - 清屏,一般使用 ctrl l 快捷鍵,也可以將 clear 命令定義得更短&…

JavaScript 作用域 與 var、let、const關鍵字

目錄 一、JavaScript 作用域 1、全局作用域 2、函數作用域 3、塊級作用域 4、綜合示例 5、總結 二、var、let、const 1、var 關鍵字 2、let 關鍵字 3、const 關鍵字 4、總結 5、使用場景 一、JavaScript 作用域 在JavaScript中,作用域是指程序中可訪問…

訂單到期關閉

文章目錄 前言一、場景?二、使用步驟1.項目配置好rocketmq2.讀入數據 其他方式處理訂單到期關閉定時任務 前言 實習期間在做訂單模塊。遇到過訂單到時關閉的場景。 因為我們在通過回調接收第三方訂單狀態的時候,使用了rocketmq,在遇到訂單超…

叁[3],使用Newtonsoft.Json.dll,異常記錄

開發環境 VS2022/.net6.0/WPF 1,異常1,反序列化數組異常。 convertError:"[{"不拉不拉***************************** 原因:檢查是Json字符串的數組格式異常。 正常數組字符串 "result":[{"key1":"value1"…

神經網絡構成、優化、常用函數+激活函數

Iris分類 數據集介紹,共有數據150組,每組包括長寬等4個輸入特征,同時給出輸入特征對應的Iris類別,分別用0,1,2表示。 從sklearn包datasets讀入數據集。 from sklearn import darasets from pandas impor…

vulnhub-NOOB-1

確認靶機 掃描靶機發現ftp Anonymous 的A大小寫都可以 查看文件 解密 登錄網頁 點擊about us會下載一個壓縮包 使用工具提取 steghide info 目標文件 //查看隱藏信息 steghide extract -sf 目標文件 //提取隱藏的文件 steghide embed -cf 隱藏信息的文件 -ef…