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模型实现完形填空任务相关推荐

  1. 【Pytorch神经网络实战案例】15 WGAN-gp模型生成Fashon-MNST模拟数据

    1 WGAN-gp模型生成模拟数据案例说明 使用WGAN-gp模型模拟Fashion-MNIST数据的生成,会使用到WGAN-gp模型.深度卷积GAN(DeepConvolutional GAN,DC ...

  2. 【Pytorch神经网络实战案例】40 TextCNN模型分析IMDB数据集评论的积极与消极

    卷积神经网络不仅在图像视觉领域有很好的效果,而且在基于文本的NLP领域也有很好的效果.TextCN如模型是卷积神经网络用于文本处理方面的一个模型. 在TextCNN模型中,通过多分支卷积技术实现对文本 ...

  3. 【Pytorch神经网络实战案例】28 GitSet模型进行步态与身份识别(CASIA-B数据集)

    1 CASIA-B数据集 本例使用的是预处理后的CASIA-B数据集, 数据集下载网址如下. http://www.cbsr.ia.ac.cn/china/Gait%20Databases%20cH. ...

  4. 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

    Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...

  5. 【Pytorch神经网络实战案例】26 MaskR-CNN内置模型实现目标检测

    1 Pytorch中的目标检测内置模型 在torchvision库下的modelsldetecton目录中,找到__int__.py文件.该文件中存放着可以导出的PyTorch内置的目标检测模型. 2 ...

  6. 【Pytorch神经网络实战案例】34 使用GPT-2模型实现句子补全功能(手动加载)

    1 GPT-2 模型结构 GPT-2的整体结构如下图,GPT-2是以Transformer为基础构建的,使用字节对编码的方法进行数据预处理,通过预测下一个词任务进行预训练的语言模型. 1.1 GPT- ...

  7. 【Pytorch神经网络实战案例】27 MaskR-CNN内置模型实现语义分割

    1 PyTorch中语义分割的内置模型 在torchvision库下的models\segmentation目录中,找到segmentation.Py文件.该文件中存放着PyTorch内置的语义分割模 ...

  8. 【Pytorch神经网络实战案例】18 最大化深度互信信息模型DIM实现搜索最相关与最不相关的图片

    图片搜索器分为图片的特征提取和匹配两部分,其中图片的特征提取是关键.将使用一种基于无监督模型的提取特征的方法实现特征提取,即最大化深度互信息(DeepInfoMax,DIM)方法. 1 最大深度互信信 ...

  9. 【Pytorch神经网络实战案例】17 带W散度的WGAN-div模型生成Fashon-MNST模拟数据

    1 WGAN-div 简介 W散度的损失函数GAN-dv模型使用了W散度来替换W距离的计算方式,将原有的真假样本采样操作换为基于分布层面的计算. 2 代码实现 在WGAN-gp的基础上稍加改动来实现, ...

最新文章

  1. 1000行python代码_GitHub - kill1000/LearnPython: 以撸代码的形式学习Python
  2. 深度学习框架 通道顺序
  3. 一名 40 岁“老”程序员的反思~
  4. 处理gateway service使用过程中遇到的400 error - Malformed URI literal syntax
  5. Spring 3.1缓存抽象教程
  6. QT事件过滤器eventFilter函数
  7. windows+nginx+tomcat实现集群负载均衡(生产环境必读)
  8. 用scanf输入long long 型的数
  9. 计算机辅助个人当面访问,优课联盟——共建共享,学分互认
  10. Spacy 常见词性标注
  11. 如何截取其他人的pdf文件中的图片(矢量图)
  12. 用Javascript实现放大镜效果
  13. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十五║初探SSR服务端渲染(个人博客二)...
  14. 弱口令是什么?有哪些注意事项?
  15. android手势_您可能不知道的七个Android手势
  16. 配置猫抓,抓取网页视频
  17. Windows 10环境下TensorFlow(gpu版本)配置教程——[图解] [详细版][零基础]
  18. Android 获取经纬度。2018年写
  19. 人机融合的科幻与现实
  20. 霸榜知乎,谴责豆瓣,数据分析告诉你《流浪地球》到底好看么?

热门文章

  1. 示波器常见的四种探头
  2. 达芬奇 - 构建数据查询API的框架
  3. python彩色蟒蛇绘制方向_Python绘制彩色蟒蛇
  4. iCloud如何只清理本地缓存而不删除云端文件
  5. 中职计算机老师的一天,信息技术教师的一天
  6. 黑马程序员_Java_多线程
  7. mysql数据库的简介(安装和卸载)
  8. SpringCloud系列之六
  9. 转型AI ,80后华为Java工程师的故事
  10. WCP人员管理之添加人员