日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Pytorch神经网络实战案例】33 使用BERT模型实现完形填空任务

發布時間:2023/12/8 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Pytorch神经网络实战案例】33 使用BERT模型实现完形填空任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 案例描述

案例:加載Transformers庫中的BERT模型,并用它實現完形填空任務,即預測一個句子中缺失的單詞。

2 代碼實現:使用BERT模型實現完形填空任務

2.1 代碼實現:載入詞表,并對輸入的文本進行分詞轉化---BERT_MASK.py(第1部分)

import torch from transformers import BertTokenizer, BertForMaskedLM# 1.1 載入詞表,并對輸入的文本進行分詞轉化 # 加載預訓練模型 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 輸入文本,BERT模型需要特殊詞來標定句子: # [CLS]:標記一個段落的開始。一個段落可以有一個或多個句子,但是只能有一個[CLS]。[CLS]在BERT模型中還會被用作分類任務的輸出特征。 # [SEP]:標記一個句子的結束。在一個段落中,可以有多個[SEP]。 text = "[CLS] Who is Li BiGor ? [SEP] Li BiGor is a programmer [SEP]" tokenized_text = tokenizer.tokenize(text) # 使用詞表對輸入文本進行轉換。與中文分詞有點類似。由于詞表中不可能覆蓋所有的單詞,因此當輸入文本中的單詞不存在時,系統會使用帶有通配符的單間(以“#”開頭的單詞)將其拆開。 print("詞表轉化結果:",tokenized_text) # 詞表轉化結果:['[CLS]','who','is','li','big','##or','?','[SEP]','li','big','##or','is','a','programmer','[SEP]']

2.2 代碼實現:遮蔽單詞,并將其轉換為索引值---BERT_MASK.py(第2部分)

# 1.2 遮蔽單詞,并將其轉換為索引值,使用標記字符[MAS]代替輸入文本中索引值為8的單詞,對“Li”進行遮蔽,并將整個句子中的單詞轉換為詞表中的索引值。 masked_index = 8 # 掩碼一個標記,再使用'BertForMaskedLM'預測回來 tokenized_text[masked_index] = '[MASK]' # 標記字符[MASK],是BERT模型中的特殊標識符。在BERT模型的訓練過程中,會對輸入文本的隨機位置用[MASK]字符進行替換,并訓練模型預測出[MASK]字符對應的值。 print("句子中的索引:",tokenized_text) # 句子中的索引:['[CLS]','who','is','li','big','##or','?','[SEP]','[MASK]','big','##or','is','a','programmer','[SEP]'] # 將標記轉換為詞匯表索引 indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text) # 將輸入轉換為PyTorch張量 tokens_tensor = torch.tensor([indexed_tokens]) print("句子中的向量:",tokens_tensor) # 句子中的向量:tensor([[101,2040,2003,5622,2502,2953,1029,102,103,2502,2953,2003,1037,20273,102]])

2.3 代碼實現:加載預訓練模型,并對遮蔽單詞進行預測---BERT_MASK.py(第3部分)

# 1.3 加載預訓練模型,并對遮蔽單詞進行預測 # 指定設備 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") print(device) # 加載預訓練模型 (weights) model = BertForMaskedLM.from_pretrained('bert-base-uncased') # 用BertForMaskedLM類加載模型,該類可以對句子中的標記字符[MASK]進行預測。 model.eval() model.to(device) # 段標記索引:定義輸入的BertForMaskedLM類句子指示參數,用于指示輸入文本中的單詞是屬于第一句還是屬于第二句。屬于第一句的單詞用0來表示(一共8個),屬于第二句的單詞用1來表示(一共7個)。 segments_ids = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] segments_tensors = torch.tensor([segments_ids]).to(device)tokens_tensor = tokens_tensor.to(device)# 預測所有的tokens with torch.no_grad():# 將文本和句子指示參數輸入模型進行預測。# 輸出結果是一個形狀為[1,15,30522]的張量。其中,1代表批次個數,15代表輸入句子中的15個單詞,30522是詞表中單詞的個數。# 模型的結果表示詞表中每個單詞在句子中可能出現的概率。outputs = model(tokens_tensor, token_type_ids=segments_tensors) predictions = outputs[0] # [1, 15, 30522] # 預測結果:從輸出結果中取出[MASK]字符對應的預測索引值。 predicted_index = torch.argmax(predictions[0, masked_index]).item() # 將預測索引值轉換為單詞。 predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0] print('預測詞為:', predicted_token) # 預測詞為: li

3 代碼總覽---BERT_MASK.py

import torch from transformers import BertTokenizer, BertForMaskedLM# 1.1 載入詞表,并對輸入的文本進行分詞轉化 # 加載預訓練模型 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 輸入文本,BERT模型需要特殊詞來標定句子: # [CLS]:標記一個段落的開始。一個段落可以有一個或多個句子,但是只能有一個[CLS]。[CLS]在BERT模型中還會被用作分類任務的輸出特征。 # [SEP]:標記一個句子的結束。在一個段落中,可以有多個[SEP]。 text = "[CLS] Who is Li BiGor ? [SEP] Li BiGor is a programmer [SEP]" tokenized_text = tokenizer.tokenize(text) # 使用詞表對輸入文本進行轉換。與中文分詞有點類似。由于詞表中不可能覆蓋所有的單詞,因此當輸入文本中的單詞不存在時,系統會使用帶有通配符的單間(以“#”開頭的單詞)將其拆開。 print("詞表轉化結果:",tokenized_text) # 詞表轉化結果:['[CLS]','who','is','li','big','##or','?','[SEP]','li','big','##or','is','a','programmer','[SEP]']# 1.2 遮蔽單詞,并將其轉換為索引值,使用標記字符[MAS]代替輸入文本中索引值為8的單詞,對“Li”進行遮蔽,并將整個句子中的單詞轉換為詞表中的索引值。 masked_index = 8 # 掩碼一個標記,再使用'BertForMaskedLM'預測回來 tokenized_text[masked_index] = '[MASK]' # 標記字符[MASK],是BERT模型中的特殊標識符。在BERT模型的訓練過程中,會對輸入文本的隨機位置用[MASK]字符進行替換,并訓練模型預測出[MASK]字符對應的值。 print("句子中的索引:",tokenized_text) # 句子中的索引:['[CLS]','who','is','li','big','##or','?','[SEP]','[MASK]','big','##or','is','a','programmer','[SEP]'] # 將標記轉換為詞匯表索引 indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text) # 將輸入轉換為PyTorch張量 tokens_tensor = torch.tensor([indexed_tokens]) print("句子中的向量:",tokens_tensor) # 句子中的向量:tensor([[101,2040,2003,5622,2502,2953,1029,102,103,2502,2953,2003,1037,20273,102]])# 1.3 加載預訓練模型,并對遮蔽單詞進行預測 # 指定設備 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") print(device) # 加載預訓練模型 (weights) model = BertForMaskedLM.from_pretrained('bert-base-uncased') # 用BertForMaskedLM類加載模型,該類可以對句子中的標記字符[MASK]進行預測。 model.eval() model.to(device) # 段標記索引:定義輸入的BertForMaskedLM類句子指示參數,用于指示輸入文本中的單詞是屬于第一句還是屬于第二句。屬于第一句的單詞用0來表示(一共8個),屬于第二句的單詞用1來表示(一共7個)。 segments_ids = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] segments_tensors = torch.tensor([segments_ids]).to(device)tokens_tensor = tokens_tensor.to(device)# 預測所有的tokens with torch.no_grad():# 將文本和句子指示參數輸入模型進行預測。# 輸出結果是一個形狀為[1,15,30522]的張量。其中,1代表批次個數,15代表輸入句子中的15個單詞,30522是詞表中單詞的個數。# 模型的結果表示詞表中每個單詞在句子中可能出現的概率。outputs = model(tokens_tensor, token_type_ids=segments_tensors) predictions = outputs[0] # [1, 15, 30522] # 預測結果:從輸出結果中取出[MASK]字符對應的預測索引值。 predicted_index = torch.argmax(predictions[0, masked_index]).item() # 將預測索引值轉換為單詞。 predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0] print('預測詞為:', predicted_token) # 預測詞為: li

總結

以上是生活随笔為你收集整理的【Pytorch神经网络实战案例】33 使用BERT模型实现完形填空任务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。