【Pytorch神经网络实战案例】32 使用Transformers库的管道方式实现:加载指定模型+文本分类+掩码语言建模+摘要生成+特征提取+阅读理解+实体词识别

管道方式是Transformers库中高度集成的极简使用方式。使用这种方式来处理NLP任务,只需要编写几行代码就能实现。通过本例的练习可以使读者对Transformers库的使用快速上手。

1 在管道方式中指定NLP任务

Transfomers库的管道方式使用起来非常简单,核心步骤只有两步:
(1)直接根据NLP任务对pipeline类进行实例化,便可以得到能够使用的模型对象。
(2)将文本输入模型对象,进行具体的NLP任务处理。

1.1 管道方式的工作原理

在Transformers库中pipeline类的源码文件pipelines.py里,可以找到管道方式自动下载的预编译模型地址。可以根据这些地址,使用第三方下载工具将其下载到本地。

1.1.1 pipelines配置文件的位置

虚拟环境文件夹\Lib\site-packages\transformers\pipelines\__init__.py

1.1.2 文件视图

 1.1.3 管道文件配置

# 在SUPPORTED_TASKS对象中,每个字典元素的key值方NLP任务名称,每个字典元素的value值为该NLP任务的具体配置。SUPPORTED_TASKS = {"audio-classification": {"impl": AudioClassificationPipeline, # 当前NLP任务的pipeline类接口"tf": (),# 指定TensorFloew框架下的自动类模型"pt": (AutoModelForAudioClassification,) if is_torch_available() else (), # 指定Pytorch框架下的自动类模型"default": {"model": {"pt": "superb/wav2vec2-base-superb-ks"}}, # 要加载的权重文件"type": "audio",},

1.1.4 管道方式的内部调用关系

 1.1.5 pipeline类接口

XXXPipeline类为每个NLP任务所对应的类接口,该接口与具体的NLP任务的对应关系如下:

  1. 文本分类任务:类接口为TextClassificationPipeline
  2. 特征提取任务:类接口为FeatureExtractionPipeline
  3. 完形填空任务:类接口为FillMaskPipeline
  4. 阅读理解任务:类接口为QuestionAnsweringPipeline
  5. 实体词识别任务:类接口为NerPipeline

管道层对下层的自动模型层进行了二次封装,完成了NLP任务的端到端实现。

1.2 在管道方式中加载指定模型

在实际应用中,也可以修改SUPPORTED._TASKS对象中的设置加载指定模型;还可以按照实例中的手动加载模型方式,加载本地已有的预训练模型。

1.2.1 加载指定模型的通用语法

# <task-name>代表任务字符串,如文本分类任务就是“sentiment--anaysis:
# <model name>:代表加载的模型:在手动加载模式下,<model name>可以是本地的预训练模型文件;在自动加载模式下,<model name>是预训练模型的唯一标识符。
pipeline("<task-name>",model="<model-name>")
pipeline('<task-name>',model='<model name>',tokenizer='<tokenizer_name>')

2 文本分类任务

2.1 文本分类的定义

文本分类是指模型可以根据文本中的内容来进行分类。文本分类模型一般是通过有监督训练得到的。对文本内容的具体分类方向,依赖于训练时所使用的样本标签。

2.1.1 文本分类的举例

如根据内容对情绪分类、根据内容对商品分类等。

2.2 代码实现:完成文本分类任务

# 代码实现:完成文本分类任务
from transformers import *
nlp = pipeline("sentiment-analysis") # 文本分类模型
print(nlp("I like this book!"))
# [{'label': 'POSITIVE', 'score': 0.9998674392700195}]
# 输出结果的前两行是下载模型的信息,最后一行是模型输出的结果。

3 特征提取任务

3.1 特征提取的含义

特征提取任务只返回文本处理后的特征,属于预训练模型范畴。

特征提取任务的输出结果需要结合其他模型一起工作,不是端到端解决任务的模型,对句子进行特征提取后的结果可以当作词向量来使用。

3.2 torchtext库的内置预训练词向量与管道方式来完成特征提取的对比

  1. 直接使用torchtext库的内置预训练词向量进行转化,也可以得到类似形状的结果。直接使用内置预训练词向量进行转化的方式对算力消耗较小,但需要将整个词表载入内存,对内存消耗较大。
  2. 使用管道方式来完成特征提取任务,只适用于数据预处理阶段。虽然会消耗一些算力,但是内存占用相对可控(只是模型的空间大小),如果再配合剪枝压缩等技术,更适合工程部署。如果要对已有的BERTology注意系列模型进行微调——对Transformers库中的模型进行再训练,还需要使用更底层的类接口。

3.3 代码实现:完成特征提取任务

# 代码实现:完成特征提取任务
from transformers import *
import numpy as np
nlp_features = pipeline('feature-extraction')
output = nlp_features('Shanxi University is a university in Shanxi.')
print(np.array(output).shape)
# (1, 12, 768)

4 完形填空/遮蔽语言建模任务

4.1 完形填空/遮蔽语言建模任务的定义

它属于BERT模型在训练过程中的一个子任务。

4.2 任务概述

在训练BERT模型时,利用遮蔽语言的方式,先对输入序列文本中的单词进行随机遮蔽,并将遮蔽后的文本输入模型,令模型根据上下文中提供的其他非遮蔽词预测遮蔽词的原始值。一旦BERT模型训练完成,即可得到一个能够处理完形填空任务的模型MLM。

4.3 代码实现:完成完形填空任务

# 代码实现:完成完形填空任务
from transformers import *
nlp_fill = pipeline("fill-mask") # 文本分类模型
print(nlp_fill.tokenizer.mask_token)
print(nlp_fill(f"Li Jinhong wrote many {nlp_fill.tokenizer.mask_token} about artificial intelligence technology and helped many people."))# 从输出结果中可以看出,模型输出了分值最大的前5名结果。其中第1行的结果预测出了被遮蔽的单词为books
#  [{'score': 0.5444340109825134, 'token': 2799, 'token_str': ' books', 'sequence': 'Li Jinhong wrote many books about artificial intelligence technology and helped many people.'}, 
#  {'score': 0.32027241587638855, 'token': 7201, 'token_str': ' articles', 'sequence': 'Li Jinhong wrote many articles about artificial intelligence technology and helped many people.'},
#  {'score': 0.024945968762040138, 'token': 27616, 'token_str': ' essays', 'sequence': 'Li Jinhong wrote many essays about artificial intelligence technology and helped many people.'}, 
#  {'score': 0.021165795624256134, 'token': 6665, 'token_str': ' papers', 'sequence': 'Li Jinhong wrote many papers about artificial intelligence technology and helped many people.'}, 
#  {'score': 0.018288355320692062, 'token': 22064, 'token_str': ' blogs', 'sequence': 'Li Jinhong wrote many blogs about artificial intelligence technology and helped many people.'}]

5 阅读理解/问答任务

5.1 阅读理解/问答任务的定义

阅读理解任务/问答任务,即输入一段文本和一个问题,令模型输出结果。

5.2 代码实现:完成阅读理解任务

# 代码实现:完成阅读理解任务
from transformers import *
nlp_qa = pipeline("question-answering")
context = 'Shanxi University is a university in Shanxi.'
question = 'Where is Shanxi University?'
print(nlp_qa(context = context,question = question))
# {'score': 0.926823079586029, 'start': 37, 'end': 43, 'answer': 'Shanxi'}

6 摘要生成任务

6.1 摘要生成的定义

摘要生成任务的输入是一段文本,输出是一段相对于输入较短的文字。

6.2 代码实现:完成摘要生成任务

# 代码实现:完成摘要生成任务【太大了,没运行】
from transformers import *
TEXT_TO_SUMMARIZE = '''
In this notebook we will be using the transformer model, first introduced in this paper. Specifically, we will be using the BERT (Bidirectional Encoder Representations from Transformers) model from this paper.
Transformer models are considerably larger than anything else covered in these tutorials. As such we are going to use the transformers library to get pre-trained transformers and use them as our embedding layers. We will freeze (not train) the transformer and only train the remainder of the model which learns from the representations produced by the transformer. In this case we will be using a multi-layer bi-directional GRU, however any model can learn from these representations.
'''
summarizer = pipeline('summarization')
print(summarizer(TEXT_TO_SUMMARIZE))

7 实体词识别任务

7.1 实体词识别的定义

实体词识别任务是NLP中的基础任务。它用于识别文本中的人名(PER)、地名(LOC)、组织(ORG)以及其他实体(MISC)等。

实体词识别任务本质上是一个分类任务,它又被称为序列标注任务。实体词识别是句法分析的基础,同时句法分析也是NLP任务的核心。

7.2 代码实现:完成实体词识别任务

# 代码实现:完成实体词识别任务【太大了,没运行】
from transformers import *
nlp_token_class = pipeline("ner")
print(nlp_token_class('Shanxi University is a university in Shanxi.'))

8 预训训练模型文件的组成及其加载时的固定文件名称

在pipeline类的初始化接口中,还可以直接指定如载模型的路径,从本地预训练模型进行载入,要求要载入的预训练模型文件心须使用固定的文件名称。

8.1 固定文件名称要求

在pipeline类接口中,预训练模型文件是以套为单位的,每套训练模型文件的组成及其固定的文件名称如下:

  1. 词表文件:以.txt、.mode或json为扩展名,存放模型中使用的词表文件。固定文件名称为vocab.txt、spiece.model:或vocab.json。
  2. 词表扩展文件(可选)上以.txt为扩展名,补充原有的词表文件。固定文件名称为merges.txt。
  3. 配置文件:以json为扩展名,存放模型的超参数配置。固定文件名称为coig,json。
  4. 权重文件:以.bin加为扩展名,存放模型中各个参数具体的值。固定文件名称为pytorch_model.bin。

8.2 加载模型的步骤

当通过指定预训练模型目录进行加载时,系统只会在目录里搜索固定名称的模型文件,当没有找到固定名称的模型文件时,将返回错误。

8.3 代码实现:加载自定义模型,并完成预测

# 代码实现:完成摘要生成任务
# 在摘要任务的基础上,加载自定义模型,并完成预测。from transformers import *TEXT_TO_SUMMARIZE = '''
In this notebook we will be using the transformer model, first introduced in this paper. Specifically, we will be using the BERT (Bidirectional Encoder Representations from Transformers) model from this paper.
Transformer models are considerably larger than anything else covered in these tutorials. As such we are going to use the transformers library to get pre-trained transformers and use them as our embedding layers. We will freeze (not train) the transformer and only train the remainder of the model which learns from the representations produced by the transformer. In this case we will be using a multi-layer bi-directional GRU, however any model can learn from these representations.
'''
# 官方模板
# summarizer = pipeline('summarization')
# 自定义模板
tokenizer = AutoTokenizer.from_pretrained(r'./bart-large-cnn/')
summarizer = pipeline("summarization", model=r'./bart-large-cnn/', tokenizer=tokenizer)
print(summarizer(TEXT_TO_SUMMARIZE))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT创建文件夹

最近在做项目的时候&#xff0c;需要创建一个新的文件夹保存临时文件&#xff0c;但是很长时间都没有解决这个问题&#xff0c;今天终于解决了&#xff0c;拿出来和网友分享一下Qt中创建文件夹的方法。如下代码是在单击按钮后&#xff0c;先判断文件夹是否存在&#xff0c;若不…

jqprint获取打印页数_如何将每张打印多页PPT的PDF变成常规课件

在工作和学习中&#xff0c;经常会收到各种 PDF 文件&#xff0c;尤其是老师的课件。为了防止学生大量上传到各种文库网站赚积分&#xff0c;或者为了方便学生打印出来预习复习。通常&#xff0c;会在每页 PDF 里面&#xff0c;打印多张 PPT 内容。一般是 6 张或 9 张&#xff…

Pycharm报错:Process finished with exit code -1066598274 (0xC06D007E)

【问题描述】pycharm运行到np.linalg.slogdet()时报错Process finished with exit code -1066598274 (0xC06D007E)&#xff0c;检查发现该函数输入shape就会报错 【解决方法】将python3.8换成python3.6&#xff0c;问题解决&#xff01;&#xff08;还是老老实实用3.6吧 -- &am…

rtt 打印 float

/*rtt print float*/float float_value;float_value 3.1415;char float_str[80];sprintf(float_str, "Float value is %f\n", float_value); NRF_LOG_PRINTF(float_str);

Hibernate学习笔记③

数据库关系 多对多&#xff1a;通过第三张表来建立关系 第三张表至少包含两个字段作为外键且字段是其他两张表的主键 Hibernate一对多的操作 &#xff08;1&#xff09;一对多映射配置 步骤: 首先创建两个存在一对多关系的实体类两个实体类需要建立一对多的关系&#xff1a;在多…

vba 判断文本框内容是否为空_【VBA】 数据输入 Inputbox 基本语法

在使用Excel 的过程中&#xff0c;如果需要用户输入简单的数据&#xff0c;作为“已知数”&#xff0c;那么可以使用inputbox 函数显示一个对话框&#xff0c;供用户在对话框中输入数据。 Inputbox 函数语法在一对话框来中显示提示&#xff0c;等待用户输入正文或按下按钮&…

AttributeError: ‘version_info‘ object has no attribute ‘version‘

AttributeError: ‘version_info‘ object has no attribute ‘version‘ 解决方法为&#xff1a;pip install pyparsing2.4.7

Qt删除 空格/空白符

QString str " ad dfdsf ef okkd ikk"; str.remove(QRegExp("\\s")); qDebug()<<str.remove(QRegExp("\\s")); "addfdsfefokkdikk"还有去掉前后的空白符 Example: QString str " lots\t of\nwhitespace\r\n "; …

无向图的深度优先遍历非递归_LeetCode0429: N叉树的层序遍历

题目介绍描述&#xff1a;给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。 (即从左到右&#xff0c;逐层遍历)。例如&#xff0c;给定一个 3叉树 :返回其层序遍历:[[1],[3,2,4],[5,6] ]说明:树的深度不会超过 1000。 树的节点总数不会超过 5000。解题思路&#xff1a;★ …

一条龙操作有效解决PermissionError: [WinError 5] 拒绝访问的问题

1 问题描述 当在使用pip install 安装包时&#xff0c;如&#xff1a;pip install scrapy scrapyd scrapyd-client spiderkeeper出现报错&#xff1a;PermissionError: [WinError 5] 拒绝访问。: ‘c:\programdata\anaconda3\lib\site-packages\dateutil\easter.py’ 2 解决办…

儿童书

我要做好孩子转载于:https://www.cnblogs.com/thingk/p/6558903.html

预订态势图

//预订态势图JS//根据日期得到对应星期几 function getWeekByDay(riqi){//2017-01-23;var getWeek "";var arys1 new Array(); arys1riqi.split(-); //日期为输入日期&#xff0c;格式为 2013-3-10var ssdatenew Date(arys1[0],parseInt(arys1[1]-1),arys1…

altera fpga sdi输出方案_FPGA在电力电子中的应用有哪些?

大家好&#xff0c;很抱歉上周末没有及时更新公众号&#xff0c;本来这期想聊聊IGBT的拖尾电流&#xff0c;但是由于周末去深圳高交会(高新技术成果交易会)逛了一天&#xff0c;时间给耽搁了&#xff0c;感觉要想把拖尾电流讲清楚也不太容易&#xff0c;还得需要点时间&#xf…

【Pytorch神经网络理论篇】 39 Transformers库中的BERTology系列模型

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

linux dump_stack

dump_stack():打印出10条函数的调用关系。 定位故障代码:arm-eabi-gdb out/target/product/msm8625/obj/KERNEL_OBJ/vmlinuxgdb) l * i2c_device_probe0xc4

Unity之CharacterController2D学习笔记(1)——基础使用

在很多游戏类型中&#xff0c;玩家角色对物理行为的处理往往和场景中其它物体的行为有比较大的区别。比如角色可能会以90多公里的时速狂奔&#xff0c;同时一次跳跃能跳10多米高&#xff0c;与此同时却几乎不会有任何惯性。同时角色在正常情况下当头部碰到障碍物的时候&#xf…

前端开发中如何将文件夹中的图片变为背景图_Web中的图像技术全面总结,长文干货!...

前端开发人员在构建网站时需要做出的决定之一就是添加图片的技术。它可以是HTML &#xff0c;也可以是通过CSS背景生成的图片&#xff0c;也可以是SVG 。选择正确的技术很重要&#xff0c;并且可以在性能和可访问性方面发挥巨大作用。最简单的情况下&#xff0c;图片元素必须包…

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

1 案例描述 案例&#xff1a;加载Transformers库中的BERT模型&#xff0c;并用它实现完形填空任务&#xff0c;即预测一个句子中缺失的单词。 2 代码实现&#xff1a;使用BERT模型实现完形填空任务 2.1 代码实现&#xff1a;载入词表&#xff0c;并对输入的文本进行分词转化--…

container_of宏

1.container_of宏 1> Container_of在Linux内核中是一个常用的宏&#xff0c;用于从包含在某个结构中的指针获得结构本身的指针&#xff0c;通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。 2>接口&#xff1a; container_of(ptr, type, …