中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

wordpress編輯器 模板seopeixun com cn

wordpress編輯器 模板,seopeixun com cn,wordpress文章加密提示,廣東一站式網(wǎng)站建設(shè)費(fèi)用1 微調(diào)腳本介紹 指定任務(wù)類型的微調(diào)腳本: huggingface研究機(jī)構(gòu)提供了針對GLUE數(shù)據(jù)集合任務(wù)類型的微調(diào)腳本, 這些微調(diào)腳本的核心都是微調(diào)模型的最后一個(gè)全連接層。通過簡單的參數(shù)配置來指定GLUE中存在任務(wù)類型(如: CoLA對應(yīng)文本二分類,MRPC對應(yīng)句子對文本二分類&…

1 微調(diào)腳本介紹

  • 指定任務(wù)類型的微調(diào)腳本:
    • huggingface研究機(jī)構(gòu)提供了針對GLUE數(shù)據(jù)集合任務(wù)類型的微調(diào)腳本, 這些微調(diào)腳本的核心都是微調(diào)模型的最后一個(gè)全連接層。
    • 通過簡單的參數(shù)配置來指定GLUE中存在任務(wù)類型(如: CoLA對應(yīng)文本二分類,MRPC對應(yīng)句子對文本二分類,STS-B對應(yīng)句子對文本多分類),以及指定需要微調(diào)的預(yù)訓(xùn)練模型。

2 指定任務(wù)類型的微調(diào)腳本使用步驟

  • 第一步: 下載微調(diào)腳本文件
  • 第二步: 配置微調(diào)腳本參數(shù)
  • 第三步: 運(yùn)行并檢驗(yàn)效果? ? ? ? ? ? ? ? ? ? ? ? ? ??

2.1 下載微調(diào)腳本文件

注意:虛擬機(jī)中已經(jīng)安裝transformers,以下安裝步驟不需再次執(zhí)行

# 克隆huggingface的transfomers文件
git clone https://github.com/huggingface/transformers.git# 進(jìn)行transformers文件夾
cd transformers# 切換transformers到指定版本
git checkout v4.17.0# 安裝transformers包
pip install .
# 進(jìn)入微調(diào)腳本所在路徑并查看
cd examples/pytorch/text-classificationls# 其中run_glue.py就是針對GLUE數(shù)據(jù)集合任務(wù)類型的微調(diào)腳本

2.2 配置微調(diào)腳本參數(shù)

  • 在run_glue.py同級目錄執(zhí)行以下命令
# 定義DATA_DIR: 微調(diào)數(shù)據(jù)所在路徑, 這里使用glue_data中的數(shù)據(jù)作為微調(diào)數(shù)據(jù)
export DATA_DIR="/root/data/glue_data"
# 定義SAVE_DIR: 模型的保存路徑, 將模型保存在當(dāng)前目錄的bert_finetuning_test文件中
export SAVE_DIR="./bert_finetuning_test/"# 使用python運(yùn)行微調(diào)腳本
# --model_name_or_path: 選擇具體的模型或者變體, 這里是在英文語料上微調(diào), 因此選擇bert-base-uncased
# --task_name: 它將代表對應(yīng)的任務(wù)類型, 如MRPC代表句子對二分類任務(wù)
# --do_train: 使用微調(diào)腳本進(jìn)行訓(xùn)練
# --do_eval: 使用微調(diào)腳本進(jìn)行驗(yàn)證
# --max_seq_length: 輸入句子的最大長度, 超過則截?cái)? 不足則補(bǔ)齊
# --learning_rate: 學(xué)習(xí)率
# --num_train_epochs: 訓(xùn)練輪數(shù)
# --output_dir $SAVE_DIR: 訓(xùn)練后的模型保存路徑
# --overwrite_output_dir: 再次訓(xùn)練時(shí)將清空之前的保存路徑內(nèi)容重新寫入# 因?yàn)榭臻g的有限,所以虛擬機(jī)中緩存了三個(gè)模型bert-base-uncased bert-base-chinese bert-base-cased
# 因?yàn)榫W(wǎng)絡(luò)原因,如果需要其他模型,需要科學(xué)上網(wǎng)才能下載# 虛擬機(jī)中執(zhí)行以下命令耗時(shí)較長,建議在有GPU的主機(jī)上執(zhí)行# 模型1,該命令已在虛擬機(jī)執(zhí)行,再次執(zhí)行會覆蓋緩存的模型
python run_glue.py \--model_name_or_path bert-base-uncased \--task_name mrpc \--do_train \--do_eval \--max_seq_length 128 \--learning_rate 2e-5 \--num_train_epochs 1.0 \--output_dir bert-base-uncased-finetuning \--overwrite_output_dir# 模型2,該命令已在虛擬機(jī)執(zhí)行,再次執(zhí)行會覆蓋緩存的模型
python run_glue.py \--model_name_or_path bert-base-chinese \--task_name mrpc \--do_train \--do_eval \--max_seq_length 128 \--learning_rate 2e-5 \--num_train_epochs 1.0 \--output_dir bert-base-chinese-finetuning \--overwrite_output_dir# 模型3,該命令已在虛擬機(jī)執(zhí)行,再次執(zhí)行會覆蓋緩存的模型
python run_glue.py \--model_name_or_path bert-base-cased \--task_name mrpc \--do_train \--do_eval \--max_seq_length 128 \--learning_rate 2e-5 \--num_train_epochs 1.0 \--output_dir bert-base-cased-finetuning \--overwrite_output_dir

2.3 檢驗(yàn)效果

1 輸出效果
# 最終打印模型的驗(yàn)證結(jié)果:
01/05/2020 23:59:53 - INFO - __main__ -   Saving features into cached file ../../glue_data/MRPC/cached_dev_bert-base-uncased_128_mrpc
01/05/2020 23:59:53 - INFO - __main__ -   ***** Running evaluation  *****
01/05/2020 23:59:53 - INFO - __main__ -     Num examples = 408
01/05/2020 23:59:53 - INFO - __main__ -     Batch size = 8
Evaluating: 100%|█| 51/51 [00:23<00:00,  2.20it/s]
01/06/2020 00:00:16 - INFO - __main__ -   ***** Eval results  *****
01/06/2020 00:00:16 - INFO - __main__ -     acc = 0.7671568627450981
01/06/2020 00:00:16 - INFO - __main__ -     acc_and_f1 = 0.8073344506341863
01/06/2020 00:00:16 - INFO - __main__ -     f1 = 0.8475120385232745
2 查看文件內(nèi)容
added_tokens.json  
checkpoint-450  
checkpoint-400  
checkpoint-350  
checkpoint-200  
checkpoint-300  
checkpoint-250  
checkpoint-200  
checkpoint-150  
checkpoint-100  
checkpoint-50     
pytorch_model.bin        
training_args.bin
config.json       
special_tokens_map.json  
vocab.txt
eval_results.txt  
tokenizer_config.json
3 文件說明
  • pytorch_model.bin代表模型參數(shù),可以使用torch.load加載查看;
  • traning_args.bin代表模型訓(xùn)練時(shí)的超參,如batch_size,epoch等,仍可使用torch.load查看;
  • config.json是模型配置文件,如多頭注意力的頭數(shù),編碼器的層數(shù)等,代表典型的模型結(jié)構(gòu),如bert,xlnet,一般不更改;
  • added_token.json記錄在訓(xùn)練時(shí)通過代碼添加的自定義token對應(yīng)的數(shù)值,即在代碼中使用add_token方法添加的自定義詞匯;
  • special_token_map.json當(dāng)添加的token具有特殊含義時(shí),如分隔符,該文件存儲特殊字符的及其對應(yīng)的含義,使文本中出現(xiàn)的特殊字符先映射成其含義,之后特殊字符的含義仍然使用add_token方法映射。
  • checkpoint: 若干步驟保存的模型參數(shù)文件(也叫檢測點(diǎn)文件)。

2.4 使用本地微調(diào)模型

import torch
from transformers import AutoModel, AutoTokenizer# 1 通過git clone下模型包, 然后再使用
# 2 直接本地加載模型
mypathname = '/root/transformers/examples/pytorch/text-classification/bert-base-uncased-finetuning'
tokenizer = AutoTokenizer.from_pretrained(mypathname)
model = AutoModel.from_pretrained(mypathname)index = tokenizer.encode("Talk is cheap", "Please show me your code!")
# 102是bert模型中的間隔(結(jié)束)符號的數(shù)值映射
mark = 102# 找到第一個(gè)102的索引, 即句子對的間隔符號
k = index.index(mark)# 句子對分割id列表, 由0,1組成, 0的位置代表第一個(gè)句子, 1的位置代表第二個(gè)句子
segments_ids = [0]*(k + 1) + [1]*(len(index) - k - 1)
# 轉(zhuǎn)化為tensor
tokens_tensor = torch.tensor([index])
segments_tensors = torch.tensor([segments_ids])# 使用評估模式
with torch.no_grad():# 使用模型預(yù)測獲得結(jié)果result = model(tokens_tensor, token_type_ids=segments_tensors)# 打印預(yù)測結(jié)果以及張量尺寸print(result)print(result[0].shape)

3 通過微調(diào)方式進(jìn)行遷移學(xué)習(xí)的兩種類型

  • 類型一: 使用指定任務(wù)類型的微調(diào)腳本微調(diào)預(yù)訓(xùn)練模型, 后接帶有輸出頭的預(yù)定義網(wǎng)絡(luò)輸出結(jié)果.
  • 類型二: 直接加載預(yù)訓(xùn)練模型進(jìn)行輸入文本的特征表示, 后接自定義網(wǎng)絡(luò)進(jìn)行微調(diào)輸出結(jié)果.

  • 說明: 所有類型的實(shí)戰(zhàn)演示, 都將針對中文文本進(jìn)行.

3.1 類型一實(shí)戰(zhàn)演示

1 介紹
  • 使用文本二分類的任務(wù)類型SST-2的微調(diào)腳本微調(diào)中文預(yù)訓(xùn)練模型, 后接帶有分類輸出頭的預(yù)定義網(wǎng)絡(luò)輸出結(jié)果. 目標(biāo)是判斷句子的情感傾向.
  • 準(zhǔn)備中文酒店評論的情感分析語料, 語料樣式與SST-2數(shù)據(jù)集相同, 標(biāo)簽0代表差評, 標(biāo)簽1好評.
  • 語料存放在與glue_data/同級目錄cn_data/下, 其中的SST-2目錄包含train.tsv和dev.tsv

  • train.tsv

sentence    label
早餐不好,服務(wù)不到位,晚餐無西餐,早餐晚餐相同,房間條件不好,餐廳不分吸煙區(qū).房間不分有無煙房.    0
去的時(shí)候 ,酒店大廳和餐廳在裝修,感覺大廳有點(diǎn)擠.由于餐廳裝修本來該享受的早飯,也沒有享受(他們是8點(diǎn)開始每個(gè)房間送,但是我時(shí)間來不及了)不過前臺服務(wù)員態(tài)度好!    1
有很長時(shí)間沒有在西藏大廈住了,以前去北京在這里住的較多。這次住進(jìn)來發(fā)現(xiàn)換了液晶電視,但網(wǎng)絡(luò)不是很好,他們自己說是收費(fèi)的原因造成的。其它還好。  1
非常好的地理位置,住的是豪華海景房,打開窗戶就可以看見棧橋和海景。記得很早以前也住過,現(xiàn)在重新裝修了??偟膩碚f比較滿意,以后還會住   1
交通很方便,房間小了一點(diǎn),但是干凈整潔,很有香港的特色,性價(jià)比較高,推薦一下哦 1
酒店的裝修比較陳舊,房間的隔音,主要是衛(wèi)生間的隔音非常差,只能算是一般的    0
酒店有點(diǎn)舊,房間比較小,但酒店的位子不錯(cuò),就在海邊,可以直接去游泳。8樓的海景打開窗戶就是海。如果想住在熱鬧的地帶,這里不是一個(gè)很好的選擇,不過威海城市真的比較小,打車還是相當(dāng)便宜的。晚上酒店門口出租車比較少。   1
位置很好,走路到文廟、清涼寺5分鐘都用不了,周邊公交車很多很方便,就是出租車不太愛去(老城區(qū)路窄愛堵車),因?yàn)槭抢腺e館所以設(shè)施要陳舊些,    1
酒店設(shè)備一般,套房里臥室的不能上網(wǎng),要到客廳去。    0
  • dev.tsv
sentence    label
房間里有電腦,雖然房間的條件略顯簡陋,但環(huán)境、服務(wù)還有飯菜都還是很不錯(cuò)的。如果下次去無錫,我還是會選擇這里的。 1
我們是5月1日通過攜程網(wǎng)入住的,條件是太差了,根本達(dá)不到四星級的標(biāo)準(zhǔn),所有的東西都很陳舊,衛(wèi)生間水龍頭用完竟關(guān)不上,浴缸的漆面都掉了,估計(jì)是十年前的四星級吧,總之下次是不會入住了。  0
離火車站很近很方便。住在東樓標(biāo)間,相比較在九江住的另一家酒店,房間比較大。衛(wèi)生間設(shè)施略舊。服務(wù)還好。10元中式早餐也不錯(cuò),很豐富,居然還有青菜肉片湯。 1
坐落在香港的老城區(qū),可以體驗(yàn)香港居民生活,門口交通很方便,如果時(shí)間不緊,坐叮當(dāng)車很好呀!周圍有很多小餐館,早餐就在中遠(yuǎn)后面的南北嚼吃的,東西很不錯(cuò)。我們定的大床房,挺安靜的,總體來說不錯(cuò)。前臺結(jié)賬沒有銀聯(lián)! 1
酒店前臺服務(wù)差,對待客人不熱情。號稱攜程沒有預(yù)定。感覺是客人在求他們,我們一定得住。這樣的賓館下次不會入住!  0
價(jià)格確實(shí)比較高,而且還沒有早餐提供。  1
是一家很實(shí)惠的酒店,交通方便,房間也寬敞,晚上沒有電話騷擾,住了兩次,有一次住501房間,洗澡間排水不暢通,也許是個(gè)別問題.服務(wù)質(zhì)量很好,剛?cè)胱r(shí)沒有調(diào)好寬帶,服務(wù)員很快就幫忙解決了.    1
位置非常好,就在西街的街口,但是卻鬧中取靜,環(huán)境很清新優(yōu)雅。  1
房間應(yīng)該超出30平米,是HK同級酒店中少有的大;重裝之后,設(shè)備也不錯(cuò). 1
2 運(yùn)行代碼

在run_glue.py同級目錄執(zhí)行以下命令

# 使用python運(yùn)行微調(diào)腳本
# --model_name_or_path: 選擇bert-base-chinese
# --task_name: 句子二分類任務(wù)sst2
# --do_train: 使用微調(diào)腳本進(jìn)行訓(xùn)練
# --do_eval: 使用微調(diào)腳本進(jìn)行驗(yàn)證
# --max_seq_length: 128,輸入句子的最大長度# 該命令已在虛擬機(jī)執(zhí)行,再次執(zhí)行會覆蓋緩存的模型python run_glue.py \--model_name_or_path bert-base-chinese \--task_name sst2 \--do_train \--do_eval \--max_seq_length 128 \--learning_rate 2e-5 \--num_train_epochs 1.0 \--output_dir bert-base-chinese-sst2-finetuning
3 查看文件內(nèi)容:
added_tokens.json
checkpoint-350
checkpoint-200
checkpoint-300
checkpoint-250
checkpoint-200
checkpoint-150
checkpoint-100
checkpoint-50
pytorch_model.bin
training_args.bin
config.json
special_tokens_map.json
vocab.txt
eval_results.txt
tokenizer_config.json
4 使用本地微調(diào)模型
import torch
# 0 找到自己預(yù)訓(xùn)練模型的路徑
mymodelname = '/root/transformers/examples/pytorch/text-classification/bert-base-chinese-sst2-finetuning'
print(mymodelname)# 1 本地加載預(yù)訓(xùn)練模型的tokenizer
tokenizer = AutoTokenizer.from_pretrained(mymodelname)# 2 本地加載 預(yù)訓(xùn)練模型 帶分類模型頭
model = AutoModelForSequenceClassification.from_pretrained(mymodelname)
# model = AutoModelForSequenceClassification.from_pretrained(model_checkpoint, num_labels=2)# 3 默認(rèn)情況下 加載預(yù)訓(xùn)練模型,不帶頭
# model = AutoModel.from_pretrained('./transformers/examples/pytorch/text-classification/bert_finetuning_test_hug')text = "早餐不好,服務(wù)不到位,晚餐無西餐,早餐晚餐相同,房間條件不好"
index = tokenizer.encode(text)
tokens_tensor = torch.tensor([index])# 使用評估模式
with torch.no_grad():# 使用模型預(yù)測獲得結(jié)果result = model(tokens_tensor)print(result[0])predicted_label = torch.argmax(result[0]).item()
print('預(yù)測標(biāo)簽為>', predicted_label)text1 = "房間應(yīng)該超出30平米,是HK同級酒店中少有的大;重裝之后,設(shè)備也不錯(cuò)."
index = tokenizer.encode(text1)
tokens_tensor = torch.tensor([index])# 使用評估模式
with torch.no_grad():# 使用模型預(yù)測獲得結(jié)果result = model(tokens_tensor)print(result[0])predicted_label = torch.argmax(result[0]).item()
print('預(yù)測標(biāo)簽為>', predicted_label)

3.2 類型二實(shí)戰(zhàn)演示

1 介紹
  • 直接加載預(yù)訓(xùn)練模型進(jìn)行輸入文本的特征表示, 后接自定義網(wǎng)絡(luò)進(jìn)行微調(diào)輸出結(jié)果.
  • 使用語料和完成的目標(biāo)與類型一實(shí)戰(zhàn)相同.
2 加載預(yù)訓(xùn)練模型

直接加載預(yù)訓(xùn)練模型進(jìn)行輸入文本的特征表示:

import torch
# 進(jìn)行句子的截?cái)嘌a(bǔ)齊(規(guī)范長度)
from keras.preprocessing import sequence# 因?yàn)榭臻g原因,虛擬機(jī)中之緩存了huggingface/pytorch-transformers模型# 從本地加載
source = '/root/.cache/torch/hub/huggingface_pytorch-transformers_master'
# 從github加載
# source = 'huggingface/pytorch-transformers'# 直接使用預(yù)訓(xùn)練的bert中文模型
model_name = 'bert-base-chinese'# 通過torch.hub獲得已經(jīng)訓(xùn)練好的bert-base-chinese模型
model =  torch.hub.load(source, 'model', model_name, source='local')
# 從github加載
# model =  torch.hub.load(source, 'model', model_name, source='github')# 獲得對應(yīng)的字符映射器, 它將把中文的每個(gè)字映射成一個(gè)數(shù)字
tokenizer = torch.hub.load(source, 'tokenizer', model_name, source='local')
# 從github加載
# tokenizer = torch.hub.load(source, 'tokenizer', model_name, source='github')# 句子規(guī)范長度
cutlen = 32def get_bert_encode(text):"""description: 使用bert-chinese編碼中文文本:param text: 要進(jìn)行編碼的文本:return: 使用bert編碼后的文本張量表示"""# 首先使用字符映射器對每個(gè)漢字進(jìn)行映射# 這里需要注意, bert的tokenizer映射后會為結(jié)果前后添加開始和結(jié)束標(biāo)記即101和102 # 這對于多段文本的編碼是有意義的, 但在我們這里沒有意義, 因此使用[1:-1]對頭和尾進(jìn)行切片indexed_tokens = tokenizer.encode(text[:cutlen])[1:-1]# 對映射后的句子進(jìn)行截?cái)嘌a(bǔ)齊indexed_tokens = sequence.pad_sequences([indexed_tokens], cutlen) # 之后將列表結(jié)構(gòu)轉(zhuǎn)化為tensortokens_tensor = torch.LongTensor(indexed_tokens)# 使模型不自動計(jì)算梯度with torch.no_grad():# 調(diào)用模型獲得隱層輸出encoded_layers = model(tokens_tensor)# 輸出的隱層是一個(gè)三維張量, 最外層一維是1, 我們使用[0]降去它.encoded_layers = encoded_layers[0]return encoded_layers
3 自定義單層的全連接網(wǎng)絡(luò)

自定義單層的全連接網(wǎng)絡(luò)作為微調(diào)網(wǎng)絡(luò)。根據(jù)實(shí)際經(jīng)驗(yàn), 自定義的微調(diào)網(wǎng)絡(luò)參數(shù)總數(shù)應(yīng)大于0.5倍的訓(xùn)練數(shù)據(jù)量, 小于10倍的訓(xùn)練數(shù)據(jù)量, 這樣有助于模型在合理的時(shí)間范圍內(nèi)收斂.

import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):"""定義微調(diào)網(wǎng)絡(luò)的類"""def __init__(self, char_size=32, embedding_size=768):""":param char_size: 輸入句子中的字符數(shù)量, 即輸入句子規(guī)范后的長度128.:param embedding_size: 字嵌入的維度, 因?yàn)槭褂玫腷ert中文模型嵌入維度是768, 因此embedding_size為768"""super(Net, self).__init__()# 將char_size和embedding_size傳入其中self.char_size = char_sizeself.embedding_size = embedding_size# 實(shí)例化一個(gè)全連接層self.fc1 = nn.Linear(char_size*embedding_size, 2)def forward(self, x):# 對輸入的張量形狀進(jìn)行變換, 以滿足接下來層的輸入要求x = x.view(-1, self.char_size*self.embedding_size)# 使用一個(gè)全連接層x = self.fc1(x)return x
4 構(gòu)建訓(xùn)練與驗(yàn)證數(shù)據(jù)批次生成器
import pandas as pd
from collections import Counter
from functools import reduce
from sklearn.utils import shuffledef data_loader(train_data_path, valid_data_path, batch_size):"""description: 從持久化文件中加載數(shù)據(jù):param train_data_path: 訓(xùn)練數(shù)據(jù)路徑:param valid_data_path: 驗(yàn)證數(shù)據(jù)路徑:param batch_size: 訓(xùn)練和驗(yàn)證數(shù)據(jù)集的批次大小:return: 訓(xùn)練數(shù)據(jù)生成器, 驗(yàn)證數(shù)據(jù)生成器, 訓(xùn)練數(shù)據(jù)數(shù)量, 驗(yàn)證數(shù)據(jù)數(shù)量"""# 使用pd進(jìn)行csv數(shù)據(jù)的讀取, 并去除第一行的列名train_data = pd.read_csv(train_data_path, header=None, sep="\t").drop([0])valid_data = pd.read_csv(valid_data_path, header=None, sep="\t").drop([0])# 打印訓(xùn)練集和驗(yàn)證集上的正負(fù)樣本數(shù)量print("訓(xùn)練數(shù)據(jù)集的正負(fù)樣本數(shù)量:")print(dict(Counter(train_data[1].values)))print("驗(yàn)證數(shù)據(jù)集的正負(fù)樣本數(shù)量:")print(dict(Counter(valid_data[1].values)))# 驗(yàn)證數(shù)據(jù)集中的數(shù)據(jù)總數(shù)至少能夠滿足一個(gè)批次if len(valid_data) < batch_size:raise("Batch size or split not match!")def _loader_generator(data):"""description: 獲得訓(xùn)練集/驗(yàn)證集的每個(gè)批次數(shù)據(jù)的生成器:param data: 訓(xùn)練數(shù)據(jù)或驗(yàn)證數(shù)據(jù):return: 一個(gè)批次的訓(xùn)練數(shù)據(jù)或驗(yàn)證數(shù)據(jù)的生成器"""# 以每個(gè)批次的間隔遍歷數(shù)據(jù)集for batch in range(0, len(data), batch_size):# 定義batch數(shù)據(jù)的張量列表batch_encoded = []batch_labels = []# 將一個(gè)bitch_size大小的數(shù)據(jù)轉(zhuǎn)換成列表形式, 并進(jìn)行逐條遍歷for item in shuffle(data.values.tolist())[batch: batch+batch_size]:# 使用bert中文模型進(jìn)行編碼encoded = get_bert_encode(item[0])# 將編碼后的每條數(shù)據(jù)裝進(jìn)預(yù)先定義好的列表中batch_encoded.append(encoded)# 同樣將對應(yīng)的該batch的標(biāo)簽裝進(jìn)labels列表中batch_labels.append([int(item[1])])# 使用reduce高階函數(shù)將列表中的數(shù)據(jù)轉(zhuǎn)換成模型需要的張量形式# encoded的形狀是(batch_size*max_len, embedding_size)encoded = reduce(lambda x, y: torch.cat((x, y), dim=0), batch_encoded)labels = torch.tensor(reduce(lambda x, y: x + y, batch_labels))# 以生成器的方式返回?cái)?shù)據(jù)和標(biāo)簽yield (encoded, labels)# 對訓(xùn)練集和驗(yàn)證集分別使用_loader_generator函數(shù), 返回對應(yīng)的生成器# 最后還要返回訓(xùn)練集和驗(yàn)證集的樣本數(shù)量return _loader_generator(train_data), _loader_generator(valid_data), len(train_data), len(valid_data)
5 編寫訓(xùn)練和驗(yàn)證函數(shù)
import torch.optim as optimdef train(train_data_labels):"""description: 訓(xùn)練函數(shù), 在這個(gè)過程中將更新模型參數(shù), 并收集準(zhǔn)確率和損失:param train_data_labels: 訓(xùn)練數(shù)據(jù)和標(biāo)簽的生成器對象:return: 整個(gè)訓(xùn)練過程的平均損失之和以及正確標(biāo)簽的累加數(shù)"""# 定義訓(xùn)練過程的初始損失和準(zhǔn)確率累加數(shù)train_running_loss = 0.0train_running_acc = 0.0# 循環(huán)遍歷訓(xùn)練數(shù)據(jù)和標(biāo)簽生成器, 每個(gè)批次更新一次模型參數(shù)for train_tensor, train_labels in train_data_labels:# 初始化該批次的優(yōu)化器optimizer.zero_grad()# 使用微調(diào)網(wǎng)絡(luò)獲得輸出train_outputs = net(train_tensor)# 得到該批次下的平均損失train_loss = criterion(train_outputs, train_labels)# 將該批次的平均損失加到train_running_loss中train_running_loss += train_loss.item()# 損失反向傳播train_loss.backward()# 優(yōu)化器更新模型參數(shù)optimizer.step()# 將該批次中正確的標(biāo)簽數(shù)量進(jìn)行累加, 以便之后計(jì)算準(zhǔn)確率train_running_acc += (train_outputs.argmax(1) == train_labels).sum().item()return train_running_loss, train_running_accdef valid(valid_data_labels):"""description: 驗(yàn)證函數(shù), 在這個(gè)過程中將驗(yàn)證模型的在新數(shù)據(jù)集上的標(biāo)簽, 收集損失和準(zhǔn)確率:param valid_data_labels: 驗(yàn)證數(shù)據(jù)和標(biāo)簽的生成器對象:return: 整個(gè)驗(yàn)證過程的平均損失之和以及正確標(biāo)簽的累加數(shù)"""# 定義訓(xùn)練過程的初始損失和準(zhǔn)確率累加數(shù)valid_running_loss = 0.0valid_running_acc = 0.0# 循環(huán)遍歷驗(yàn)證數(shù)據(jù)和標(biāo)簽生成器for valid_tensor, valid_labels in valid_data_labels:# 不自動更新梯度with torch.no_grad():# 使用微調(diào)網(wǎng)絡(luò)獲得輸出valid_outputs = net(valid_tensor)# 得到該批次下的平均損失valid_loss = criterion(valid_outputs, valid_labels)# 將該批次的平均損失加到valid_running_loss中valid_running_loss += valid_loss.item()# 將該批次中正確的標(biāo)簽數(shù)量進(jìn)行累加, 以便之后計(jì)算準(zhǔn)確率valid_running_acc += (valid_outputs.argmax(1) == valid_labels).sum().item()return valid_running_loss,  valid_running_acc
6 調(diào)用并保存模型
if __name__ == "__main__":# 設(shè)定數(shù)據(jù)路徑train_data_path = "/root/data/glue_data/SST-2/train.tsv"valid_data_path = "/root/data/glue_data/SST-2/dev.tsv"# 定義交叉熵?fù)p失函數(shù)criterion = nn.CrossEntropyLoss()# 定義SGD優(yōu)化方法optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 定義訓(xùn)練輪數(shù)epochs = 4# 定義批次樣本數(shù)量batch_size = 16# 進(jìn)行指定輪次的訓(xùn)練for epoch in range(epochs):# 打印輪次print("Epoch:", epoch + 1)# 通過數(shù)據(jù)加載器獲得訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)生成器, 以及對應(yīng)的樣本數(shù)量train_data_labels, valid_data_labels, train_data_len, \valid_data_len = data_loader(train_data_path, valid_data_path, batch_size)# 調(diào)用訓(xùn)練函數(shù)進(jìn)行訓(xùn)練train_running_loss, train_running_acc = train(train_data_labels)# 調(diào)用驗(yàn)證函數(shù)進(jìn)行驗(yàn)證valid_running_loss, valid_running_acc = valid(valid_data_labels)# 計(jì)算每一輪的平均損失, train_running_loss和valid_running_loss是每個(gè)批次的平均損失之和# 因此將它們乘以batch_size就得到了該輪的總損失, 除以樣本數(shù)即該輪次的平均損失train_average_loss = train_running_loss * batch_size / train_data_lenvalid_average_loss = valid_running_loss * batch_size / valid_data_len# train_running_acc和valid_running_acc是每個(gè)批次的正確標(biāo)簽累加和,# 因此只需除以對應(yīng)樣本總數(shù)即是該輪次的準(zhǔn)確率train_average_acc = train_running_acc /  train_data_lenvalid_average_acc = valid_running_acc / valid_data_len# 打印該輪次下的訓(xùn)練損失和準(zhǔn)確率以及驗(yàn)證損失和準(zhǔn)確率print("Train Loss:", train_average_loss, "|", "Train Acc:", train_average_acc)print("Valid Loss:", valid_average_loss, "|", "Valid Acc:", valid_average_acc)print('Finished Training')# 保存路徑MODEL_PATH = './BERT_net.pth'# 保存模型參數(shù)torch.save(net.state_dict(), MODEL_PATH) print('Finished Saving')    
7 加載模型進(jìn)行使用
if __name__ == "__main__":MODEL_PATH = './BERT_net.pth'# 加載模型參數(shù)net.load_state_dict(torch.load(MODEL_PATH))# text = "酒店設(shè)備一般,套房里臥室的不能上網(wǎng),要到客廳去。"text = "房間應(yīng)該超出30平米,是HK同級酒店中少有的大;重裝之后,設(shè)備也不錯(cuò)."print("輸入文本為:", text)with torch.no_grad():output = net(get_bert_encode(text))# 從output中取出最大值對應(yīng)的索引print("預(yù)測標(biāo)簽為:", torch.argmax(output).item())

http://www.risenshineclean.com/news/64109.html

相關(guān)文章:

  • 動態(tài)網(wǎng)站開發(fā) 實(shí)訓(xùn)總結(jié)環(huán)球貿(mào)易網(wǎng)
  • 解除網(wǎng)站被攔截的方法快手流量推廣免費(fèi)網(wǎng)站
  • 合肥建網(wǎng)站公司騰訊與中國聯(lián)通
  • 各大網(wǎng)站提交入口怎么聯(lián)系地推公司
  • 西安火車站網(wǎng)站建設(shè)安卓優(yōu)化大師官方下載
  • 頂級裝修公司百度小程序優(yōu)化
  • 莆田網(wǎng)站建設(shè)技術(shù)托管南陽網(wǎng)站seo
  • 開發(fā)公司屬于什么行業(yè)網(wǎng)站優(yōu)化 seo和sem
  • 中國專業(yè)的網(wǎng)站建設(shè)12月10日新聞
  • 義烏多語言網(wǎng)站建設(shè)seo網(wǎng)絡(luò)推廣技術(shù)
  • 做五金生意什么網(wǎng)站做比較好精準(zhǔn)營銷的三要素
  • 網(wǎng)站首頁的模塊布局杭州百度快速排名提升
  • 做競猜網(wǎng)站合法嗎如何快速提升網(wǎng)站關(guān)鍵詞排名
  • 哪個(gè)平臺查企業(yè)免費(fèi)谷歌aso優(yōu)化
  • 專業(yè)做網(wǎng)站公司哪家好一句簡短走心文案
  • 個(gè)人做理財(cái)網(wǎng)站好上海seo關(guān)鍵詞優(yōu)化
  • ppt中仿網(wǎng)站鏈接怎么做b站引流推廣網(wǎng)站
  • 做網(wǎng)站的步驟流程seo外包杭州
  • 網(wǎng)站建設(shè)全套流程廣州seo全網(wǎng)營銷
  • 網(wǎng)站建設(shè)中的咨詢服務(wù)北京網(wǎng)絡(luò)推廣
  • 網(wǎng)站建設(shè)色系搭配種子資源
  • 長沙畢業(yè)設(shè)計(jì)代做網(wǎng)站價(jià)格網(wǎng)域名查詢地址
  • 如何做微商城網(wǎng)站建設(shè)國內(nèi)推廣平臺
  • 網(wǎng)站開發(fā)主流技術(shù)線路介紹網(wǎng)站制作論文
  • 專業(yè)設(shè)計(jì)企業(yè)網(wǎng)站中國體育新聞
  • 一個(gè)公司做兩個(gè)網(wǎng)站的好處我想接app純注冊推廣單
  • 網(wǎng)站前臺建設(shè)用到哪些工具百度app手機(jī)版
  • 政府網(wǎng)站建設(shè)要求有哪些口紅的推廣軟文
  • 地產(chǎn)公司做網(wǎng)站維護(hù)寫代碼么6廣州seo公司官網(wǎng)
  • 用DW做的網(wǎng)站怎么分享給別人怎樣做線上銷售