基于 FastAI 文本遷移學習的情感分類(93%+Accuracy)

膠片情感分析

前言

系列專欄:【深度學習:算法項目實戰】??
涉及醫療健康、財經金融、商業零售、食品飲料、運動健身、交通運輸、環境科學、社交媒體以及文本和圖像處理等諸多領域,討論了各種復雜的深度神經網絡思想,如卷積神經網絡、循環神經網絡、生成對抗網絡、門控循環單元、長短期記憶、自然語言處理、深度強化學習、大型語言模型和遷移學習。

情感分析是指利用自然語言處理、文本分析、計算語言學和生物統計學,系統地識別、提取、量化和研究情感狀態和主觀信息。

語言模型通過學習來預測單詞序列的概率。但為什么我們需要學習單詞的概率呢?讓我們通過一個例子來理解。我相信你一定用過谷歌翻譯。出于不同的原因,我們都會用它將一種語言翻譯成另一種語言。這是一個流行的 NLP 應用的例子,叫做機器翻譯。在 “機器翻譯 ”中,你需要從一種語言中輸入一堆單詞,然后將這些單詞轉換成另一種語言。現在,系統可能會給出許多潛在的翻譯,您需要計算每種翻譯的概率,以了解哪種翻譯最準確。

目錄

  • 1. 根據預訓練模型訓練文本分類器
    • 1.1 使用高級應用程序接口
    • 1.2 使用數據塊應用程序接口
  • 2. ULMFiT 方法
    • 2.1 微調 IMDb 上的語言模型
    • 2.2 訓練文本分類器

我們將使用《學習詞向量進行情感分析》一文中的 IMDb 數據集,該數據集包含數千條電影評論。

1. 根據預訓練模型訓練文本分類器

我們將嘗試使用預訓練模型來訓練分類器,為了準備好數據,我們將首先使用高級 API:

1.1 使用高級應用程序接口

我們可以使用以下命令下載數據并解壓:

from fastai.text.all import *
path = untar_data(URLs.IMDB)
path.ls()
(#5) [Path('/home/sgugger/.fastai/data/imdb/unsup'),Path('/home/sgugger/.fastai/data/imdb/models'),Path('/home/sgugger/.fastai/data/imdb/train'),Path('/home/sgugger/.fastai/data/imdb/test'),Path('/home/sgugger/.fastai/data/imdb/README')]
(path/'train').ls()
(#4) [Path('/home/sgugger/.fastai/data/imdb/train/pos'),Path('/home/sgugger/.fastai/data/imdb/train/unsupBow.feat'),Path('/home/sgugger/.fastai/data/imdb/train/labeledBow.feat'),Path('/home/sgugger/.fastai/data/imdb/train/neg')]

數據按照 ImageNet 風格組織,在 train 文件夾中,我們有兩個子文件夾:pos 和 neg(分別用于正面評論和負面評論)。我們可以使用 TextDataLoaders.from_folder 方法收集數據。我們唯一需要指定的是驗證文件夾的名稱,即 “test”(而不是默認的 “valid”)。

dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test')

然后,我們可以使用 show_batch 方法查看數據:

dls.show_batch()

在這里插入圖片描述
文本數據
我們可以看到,該程序庫自動處理了所有文本,然后將其拆分成標記符,并添加了一些特殊標記符,如

  • xxbos 表示文本開始
  • xxmaj 表示下一個詞被大寫

這樣,我們就可以在一行中定義一個適合文本分類的學習器:

learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy)

我們使用 AWD LSTM 架構,drop_mult 是一個參數,用于控制該模型中所有 dropout 的大小,我們使用準確率來跟蹤我們模型效果。然后,我們就可以對預訓練模型進行微調:

learn.fine_tune(4, 1e-2)

學習

learn.fine_tune(4, 1e-2)

模型訓練
還不錯!我們可以使用 show_results 方法來查看模型的運行情況:

learn.show_results()

文本分類模型評估
我們可以很容易地預測新文本:

learn.predict("I really liked that movie!")
('pos', tensor(1), tensor([0.0092, 0.9908]))

在這里,我們可以看到模型認為該評論是正面的。結果的第二部分是 “pos ”在我們的數據詞匯表中的索引,最后一部分是每個類別的概率(“pos ”為 99.1%,“neg ”為 0.9%)。

1.2 使用數據塊應用程序接口

我們還可以使用數據塊 API 在 DataLoaders 中獲取數據。這部分比較高深,如果你還不習慣學習新的 API,可以跳過這部分。

數據庫塊是通過向 fastai 庫提供大量信息而建立的:
通過一個名為 “塊”(block)的參數來確定所使用的類型:這里我們有文本和類別,因此我們傳遞 TextBlock 和 CategoryBlock。為了通知庫我們的文本是文件夾中的文件,我們使用了 from_folder 類方法。

  • 如何獲取原始項目,這里使用函數 get_text_files
  • 如何標注這些項目,這里使用父文件夾。
  • 如何分割這些項目,此處使用祖文件夾。
imdb = DataBlock(blocks=(TextBlock.from_folder(path), CategoryBlock),get_items=get_text_files,get_y=parent_label,splitter=GrandparentSplitter(valid_name='test'))

這只是提供了一個如何組合數據的藍圖。要實際創建數據,我們需要使用 dataloaders 方法:

dls = imdb.dataloaders(path)

2. ULMFiT 方法

我們在上一節中使用的預訓練模型被稱為語言模型。它是在維基百科上進行預訓練的,任務是在閱讀了前面所有單詞后猜測下一個單詞。我們將這個語言模型直接微調為電影評論分類器,取得了很好的效果,但只要多做一步,我們就能做得更好:維基百科的英語與 IMDb 的英語略有不同。因此,我們可以根據 IMDb 語料庫微調預訓練的語言模型,然后以此為基礎建立分類器,而不是直接跳轉到分類器。

當然,其中一個原因是,了解你正在使用的模型的基礎是很有幫助的。但還有一個非常實用的原因,那就是如果在微調分類模型之前微調(基于序列的)語言模型,就能獲得更好的結果。例如,在 IMDb 情感分析任務中,數據集包含了 50,000 條額外的電影評論,這些評論在 unsup 文件夾中沒有附加任何正面或負面標簽。我們可以使用所有這些影評來微調預訓練的語言模型–這將產生一個特別擅長預測影評下一個單詞的語言模型。相比之下,預訓練模型只在維基百科文章中進行訓練。

這幅圖概括了整個過程:請添加圖片描述

2.1 微調 IMDb 上的語言模型

我們可以很容易地將文本放入適合語言建模的 DataLoaders 中:

dls_lm = TextDataLoaders.from_folder(path, is_lm=True, valid_pct=0.1)

我們需要為 valid_pct 傳遞一些信息,否則該方法將嘗試使用祖文件夾名稱來分割數據。通過傳遞 valid_pct=0.1,我們可以告訴它隨機獲取其中 10%的評論作為驗證集。

我們可以使用 show_batch 查看數據。這里的任務是猜測下一個單詞,因此我們可以看到目標都向右移動了一個單詞。

dls_lm.show_batch(max_n=5)

在這里插入圖片描述
然后,我們有一個方便的方法,可以像以前一樣使用 AWD_LSTM 架構直接從中抓取一個學習器。我們使用準確率和困惑度作為衡量指標(困惑度是損失的指數),并將默認權重衰減設為 0.1。

learn = language_model_learner(dls_lm, AWD_LSTM, metrics=[accuracy, Perplexity()], path=path, wd=0.1).to_fp16()

默認情況下,預訓練的學習器處于凍結狀態,這意味著只有模型的頭部會進行訓練,而主體則保持凍結。在這里,我們將向你展示 fine_tune 方法背后的內容,并使用 fit_one_cycle 方法來擬合模型:

learn.fit_one_cycle(1, 1e-2)

訓練模型
這個模型的訓練需要一段時間,所以這是一個很好的機會來討論保存中間結果的問題。

您可以像這樣輕松保存模型的狀態:

learn.save('1epoch')

它會在 learn.path/models/ 中創建一個名為 “1epoch.pth ”的文件。如果您想在以同樣方式創建學習器后在另一臺機器上加載模型,或稍后繼續訓練,您可以通過以下方式加載該文件的內容:

learn = learn.load('1epoch')

我們可以在解凍后對模型進行微調:

learn.unfreeze()
learn.fit_one_cycle(10, 1e-3)

在這里插入圖片描述
完成后,我們就可以保存模型的全部內容,但最后一層除外,該層將激活度轉換為選取詞匯表中每個標記的概率。不包括最后一層的模型稱為編碼器。我們可以用 save_encoder 保存它:

learn.save_encoder('finetuned')

術語:Encoder(編碼器): 不包括特定任務最終層的模型。在應用于視覺 CNN 時,其含義與 body 大致相同,但更多用于 NLP 和生成模型。

在利用這一點對評論分類器進行微調之前,我們可以使用我們的模型來生成隨機評論:因為它經過訓練可以猜測句子的下一個單詞是什么,所以我們可以用它來編寫新的評論:

TEXT = "I liked this movie because"
N_WORDS = 40
N_SENTENCES = 2
preds = [learn.predict(TEXT, N_WORDS, temperature=0.75) for _ in range(N_SENTENCES)]
print("\n".join(preds))
i liked this movie because of its story and characters . The story line was very strong , very good for a sci - fi film . The main character , Alucard , was very well developed and brought the whole story
i liked this movie because i like the idea of the premise of the movie , the ( very ) convenient virus ( which , when you have to kill a few people , the " evil " machine has to be used to protect

2.2 訓練文本分類器

我們幾乎可以像以前一樣收集數據進行文本分類:

dls_clas = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test', text_vocab=dls_lm.vocab)

主要區別在于,我們必須使用與微調語言模型時完全相同的詞匯,否則學習到的權重將毫無意義。我們用 text_vocab 傳遞這個詞匯。

然后,我們就可以像之前一樣定義文本分類器了:

learn = text_classifier_learner(dls_clas, AWD_LSTM, drop_mult=0.5, metrics=accuracy)

所不同的是,在訓練之前,我們先加載之前的編碼器:

learn = learn.load_encoder('finetuned')

最后一步是使用辨別學習率和漸進解凍進行訓練。在計算機視覺中,我們通常會一次性解凍模型,但對于 NLP 分類器,我們發現每次解凍幾層會帶來真正的不同。

learn.fit_one_cycle(1, 2e-2)

在這里插入圖片描述
只用了一個歷元,我們就得到了與第一節中的訓練相同的結果,不算太差!我們可以向 freeze_to 傳遞 -2 以凍結除最后兩個參數組之外的所有參數:

learn.freeze_to(-2)
learn.fit_one_cycle(1, slice(1e-2/(2.6**4),1e-2))

訓練
然后我們可以再解凍一些,繼續訓練:

learn.freeze_to(-3)
learn.fit_one_cycle(1, slice(5e-3/(2.6**4),5e-3))

訓練
最后是整個模型!

learn.unfreeze()
learn.fit_one_cycle(2, slice(1e-3/(2.6**4),1e-3))

訓練整個模型

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

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

相關文章

[vue3后臺管理二]首頁和登錄測試

[vue3后臺管理二]首頁和登錄測試 1 修改main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vue import router from ./router createApp(App).use(router).mount(#app)2 路由創建 import {createRouter, createWebHistory} from vue-ro…

計算機網絡學習筆記——運輸層(b站)

目錄 一、 運輸層概述 二、運輸層端口號、復用與分用的概念 三、UDP和TCP的對比 四、TCP的流量控制 五、TCP的擁塞控制 六、TCP超時重傳時間的選擇 七、TCP可靠傳輸的實現 八、TCP報文段的首部格式 一、 運輸層概述 物理層、數據鏈路層、網絡層實現了主機到主機的通信…

使用springdoc-openapi-starter-webmvc-ui后訪問swagger-ui/index.html 報錯404

按照官網說明,引入 springdoc-openapi-starter-webmvc-ui后應該就可以直接訪問swagger-ui.html或者swagger-ui/index.html就可以出現swagger頁面了,但是我引入后,訪問提示報錯404. 在我的項目中,有其他依賴間接引入了org.webjars…

剪映網頁版

https://www.capcut.cn/web 免費,免安裝,跨平臺,視頻云合成,簡直太好用了!

echarts-事件

echarts部分事件 添加點擊事件 添加點擊事件: let options {tooltip: {},xAxis: {type: "category",data: ["d1", "d2", "d3", "d4"],},yAxis: {},series: [{type: "line",data: d1,},{type: &qu…

Codeforces Round 948 (Div. 2) E. Tensor(思維題-交互)

題目 n(3<n<100)個點的有向圖&#xff0c; 圖的邊的關系未知&#xff0c;但保證以下兩點&#xff1a; 1. 只存在j->i&#xff08;i<j&#xff09;的邊 2. 對于任意三個點i、j、k&#xff08;i<j<k&#xff09;&#xff0c;要么k可以到達i&#xff0c;要么…

18 js時間對象

時間對象是一種復雜數據類型&#xff0c;用來存儲時間 創建時間對象 內置構造函數創建 語法&#xff1a;var 時間名new Date() var datenew Date()console.log(date) //Wed May 29 2024 16:03:47 GMT0800 (中國標準時間) 創建指定日期 當參數為數字——>在格林威治的時間基…

知識付費小程序源碼系統 界面支持萬能DIY裝修,一站式運營 附帶完整的源代碼以及搭建教程

系統概述 這是一款功能強大的知識付費小程序源碼系統&#xff0c;它為用戶提供了一個全面的平臺&#xff0c;能夠滿足各種知識付費場景的需求。其界面支持萬能 DIY 裝修&#xff0c;讓用戶可以根據自己的品牌形象和風格進行個性化定制&#xff0c;打造出獨具特色的小程序界面。…

解釋“this”的工作原理,原型繼承如何工作,以及如何實現手寫JS繼承。還包括Array對象自帶的方法列舉,以及如何使用閉包。

1:"this"的工作原理: this 關鍵字指向當前執行上下文的對象,也就是當前函數被調用時所在的對象。this 的值取決于函數的調用方式,不同的調用方式會導致 this 指向不同的對象:作為對象的方法調用,this 指向該對象作為普通函數調用,this 指向全局對象(瀏覽器中是 wind…

愛問云網課加密視頻去除錄屏檢測翻錄工具使用方法

很多伙伴反饋說遇到愛問云的網課&#xff0c;直接打開錄屏工具會被檢測&#xff0c;并且錄出來黑屏。 基于這種情況&#xff0c;可以用我們這個教程翻錄為mp4&#xff0c;可以用到我們的工具。 用這個錄不會被檢測&#xff0c;而且不會黑屏。 提前是必須有授權能正常播放才可…

【云原生】Kubernetes----PersistentVolume(PV)與PersistentVolumeClaim(PVC)詳解

目錄 引言 一、存儲卷 &#xff08;一&#xff09;存儲卷定義 &#xff08;二&#xff09;存儲卷的作用 1.數據持久化 2.數據共享 3.解耦 4.靈活性 &#xff08;三&#xff09;存儲卷的分類 1.emptyDir存儲卷 1.1 定義 1.2 特點 1.3 示例 2.hostPath存儲卷 2.1 …

Leetcode373.查找和最小的 K 對數字

文章目錄 題目描述解題思路代碼 題目鏈接 題目描述 給定兩個以 非遞減順序排列 的整數數組 nums1 和 nums2 , 以及一個整數 k 。 定義一對值 (u,v)&#xff0c;其中第一個元素來自 nums1&#xff0c;第二個元素來自 nums2 。 請找到和最小的 k 個數對 (u1,v1), (u2,v2) … (…

大模型日報2024-05-29

大模型日報 2024-05-29 大模型資訊 大型語言模型在金融預測中將超越人類分析師 摘要: 新研究表明&#xff0c;大型語言模型如ChatGPT在金融預測方面表現優于人類專家&#xff0c;為交易策略提供了寶貴的見解。這意味著未來這些模型將在金融領域發揮更重要的作用&#xff0c;提升…

使用Keepalived提高吞吐量和負載均衡ip_hash.

一 . Nginx使用Keepalived提高吞吐量案例 Keepalived[表示把連接保持一定長連接數來提高吞吐量] 1.1沒有使用keepalived參數 upstream tomcats {server 192.168.28.102:8080; } server {listen 88;server_name www.tomcats.com;location / {proxy_pass http://to…

深入探索JavaScript:精準判斷對象間的“真”相等【含代碼示例】

深入探索JavaScript&#xff1a;精準判斷對象間的“真”相等【含代碼示例】 基本概念與作用說明 與 的區別Object.is()深度比較的必要性 實戰案例&#xff1a;五種深度比較策略案例一&#xff1a;樸素遞歸法案例二&#xff1a;JSON.stringify()法&#xff08;謹慎使用&#xf…

postman教程-6-發送delete請求

領取資料&#xff0c;咨詢答疑&#xff0c;請?wei: June__Go 上一小節我們學習了postman發送put請求的方法&#xff0c;本小節我們講解一下postman發送delete請求的方法。 HTTP DELETE 請求是一種用于刪除指定資源的請求方法。在RESTful API 設計中&#xff0c;DELETE 請求…

tensorboard可視化時save_graph報錯ERROR: Graphs differed across invocations!的一個解決方法

在使用tensorboard可視化&#xff0c;經常會將模型通過save_graph方法保存下來&#xff0c;方便查看結構。在使用save_graph經常會遇到錯誤&#xff08;至少我經常遇到&#xff09;&#xff0c;對于我&#xff0c;最常見的一個錯誤為 Tracing failed sanity checks! ERROR: Gr…

GPT-4o:重塑人機交互的未來

一個愿意佇立在巨人肩膀上的農民...... 一、推出 在人工智能&#xff08;AI&#xff09;領域&#xff0c;自然語言處理&#xff08;NLP&#xff09;技術一直被視為連接人類與機器的橋梁。近年來&#xff0c;隨著深度學習技術的快速發展&#xff0c;NLP領域迎來了前所未有的變革…

ARM-V9 RME(Realm Management Extension)系統架構之系統能力的執行隔離

安全之安全(security)博客目錄導讀 目錄 一、執行隔離 1、安全狀態 2、安全模型 本博客探討 RME 所需的系統能力&#xff0c;以保證 Arm CCA 對于 Realms 的安全性和隔離特性。 一、執行隔離 1、安全狀態 RME 系統支持以下安全狀態&#xff1a; 非安全 (Non-secure)安全…

Orange Pi Kunpeng Pro測評

#創作靈感# 參加樹莓派鯤鵬開發版的測評活動&#xff0c;也想體驗一下該開發版&#xff0c;之前有做過樹莓派和香橙派的開發&#xff0c;剛好借此機會了解一下鯤鵬&#xff0c;所以就有了這篇測評文章。 #正文# 引言 說是測評&#xff0c;其實也沒有多少測評方面的內容&…