使用标记器(tokenizer)
在之前提到过,标记器(tokenizer)是用来对文本进行预处理的一个工具。

首先,标记器会把输入的文档进行分割,将一个句子分成单个的word(或者词语的一部分,或者是标点符号)

这些进行分割以后的到的单个的word被称为tokens。

第二步,标记器会把这些得到的单个的词tokens转换成为数字,经过转换成数字之后,我们就可以把它们送入到模型当中。

为了实现这种能把tokens转换成数字的功能,标记器拥有一个词表,这个词汇表是在我们进行实例化并指明模型的时候下载的,这个标记器使用的词汇表与模型在预训练时使用的词汇表相同。

举个例子说:

from transformers import AutoTokenizer,AutoModelForSequenceClassification
 
Model_name = 'distillery-base-uncashed-finetuned-still-2-english'
 
model=AutoModelForSequenceClassification.from_pretrained(model_name)
 
tokenizer=AutoTokenizer.from_pretrained(model_name)
 
sentence="We are very happy to show you the Transformers library"
 
inputs = tokenizer(sentence)
然后打印一下得到的结果:

print(inputs)
{'input_ids': [101, 2057, 2024, 2200, 3407, 2000, 2265, 2017, 1996, 100, 19081, 3075, 1012, 102],

'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

可以看到,返回值是一个字典,这个字典里面有两个键值对,第一个键值对'input_ids'是对输入的句子转换成数字以后的结果,并且长度为这个句子的单词的个数。

第二个'attention_mask'这里面全部都是1,表示让模型关注里面所有的词,具体相关的应用后面会再提到。

上面的例子是拿一个句子放入标记器中得到的结果,如果希望一次放入一批(batch)语句,希望将这一批句子都转换成为数字送到模型里面去,那么你可以这么做

sentences=["We are very happy to show you the Transformers library",
 
"We hope you don't hate it"]

Pt_batch = tokenizer(
 
Sentences,
 
padding=True,
 
truncation=True,
 
max_length=512,
 
return_tensors="Pt"
 
)
首先padding属性是用来指明是否启用填补。他会自动补全结果中的input_ids以及attention_mask右边缺失的值。

打印一下结果来看一下:

for key,value in pt_batch.items():

print(f"{key}:{value.numpy().tolist()}")

input_ids: [[101, 2057, 2024, 2200, 3407, 2000, 2265, 2017, 1996, 100, 19081, 3075, 1012, 102], [101, 2057, 3246, 2017, 2123, 1005, 1056, 5223, 2009, 1012, 102, 0, 0, 0]]
attention_mask: [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]]
可以看到结果中第二个句子的最右边补充了一些0,这是因为使用了padding属性,第二个句子没有第一个句子长,而我们希望得到的结果都是一样长的,所以会自动的在结尾补充0,并且在attention_mask字段里面也补充了0。

使用模型
当我们对输入的数据使用标记器进行处理之后,可以直接把它送到模型当中,这些数据会包含所有模型需要的相关信息。

在使用pytorch的时候,你需要可以用下面的方法对字典类型进行解包:

Pt_outputs = pt_model(**pt_batch)
在Transformers中,所有的输出都是一个元组(tuple)

Print(pt_ourputs)

(tensor([[-4.0833,  4.3364],
        [ 0.0818, -0.0418]], grad_fn=<AddmmBackward>),)
可以看到得到的结果

接下来使用SoftMax激活函数进行预测,并打印一下最终的结果

Import torch.nn.functional as F
 
pt_predictions = F.softmax(py_output[0],dim=-1)
 
print(pt_predictions)
tensor([[2.2043e-04, 9.9978e-01],
        [5.3086e-01, 4.6914e-01]], grad_fn=<SoftmaxBackward>)
这里输出的只是经过了softmax函数后得到的结果,那么如果有标签的时候,需要在使用模型的时候,在label字段指明标签

import torch
 
pt_output = pt_model(**pt_batch,labels = torch.tensor([1,0]))
在Transformers提供了一个Trainer类来帮助训练

模型的保存
在模型进行微调之后,可以对模型以及标记器进行保存操作

save_directory='E:/my model/'
 
tokenizer.save_pretrained(save_directory)
 
model.save_pretrained(save_directory)
这样就可以将模型进行保存

模型的加载
如果想要重新加载之前训练好并保存的模型,可以使用一个from_pretrained()方法,通过传入保存了模型的文件夹路径。

tokenizer = AutoTokenizer.from_pretrained(save_directory)
 
model = AutoModel.from_pretrained(save_directory)
如果希望读取TensorFlow模型,那么需要一点点改变

model=AutoModel.from_pretrained(save_directory,from_tf=True)
最终,如果在使用模型的时候,你希望得到的不仅仅是最终的输出,还希望能得到所有的隐藏层状态以及注意力权重,你可以这样做:

pt_outputs = pt_model(**pt_batch,output_hidden_states= True,output_attentions=True)
 
All_hidden_states ,all_attentions = pt_outputs[-2:]
访问代码
之前用到的AutoModel与AutoTokenizer两个类实际上可以和任何的预训练模型一起工作。

在之前的实例中,模型使用的是"distilbert-base-uncashed-finetuned-still-2-enghish",这意味着我们使用的是DistilBERT的结构。

在创建模型的时候用到的AutoModelForSequenceClassification会自动创建一个DistilBertForSequenceCLassification。

如果不使用自动的方式构建,我们可以使用下面的代码:

from transformers import DistilBertTokenizer,DistilBertForSequenceClassification
 
model_name = "distilbert-base-uncashed-fintuned-still-2-english"
 
model = DistilBertForSequenceClassification.from_pretrain(model_name)
 
tokenizer = DIstilBertTokenizer.from_pretrained(model_name)
自定义模型
如果希望改变的一些参数,来定义自己的特殊的类,那么可以使用模型特定的或者说相关的配置文件(configuration)比如说,在之前用熬的DistilBERT中,可以使用DistilBertConfig来设置隐藏层纬度,dropout rate等等。

具体来说:

from transformers import DIstilBertConfig,DIstilBertTokenizer,DistilBertForSequence
 
config = DistilBertTokenizer(n_heads=8,dim=512,hidden_dim=4*512)
 
tokenizer=DistilBertTokenizer.from_pretrained('distilbert-base-uncased')
 
model = DistilBertForSequenceClassification(config)
如果你希望改变的只是模型的头,比如说标签的数量,那么你只需要直接改变模型创建时候的参数即可

from transformers import DIstilBertConfig,DistilBertTokenizer,DistilBertForSequenceClassification
 
model_name='distilbert-base-uncased'
 
model = DistilBertForSequenceClassification.from_pretrained(model_name,num_labels=10)
 
tokenizer = DistilBertTokenizer.from_pretrained(model_name)

transformers库的使用【二】tokenizer的使用,模型的保存自定义相关推荐

  1. Huggingface Transformers库学习笔记(二):使用Transformers(上)(Using Transformers Part 1)

    前言 本部分是Transformer库的基础部分的上半部分,主要包括任务汇总.模型汇总和数据预处理三方面内容,由于许多模型我也不太了解,所以多为机器翻译得到,错误再所难免,内容仅供参考. Huggin ...

  2. Transformers 库中的 Tokenizer 使用

    文章目录 概述 基本使用方法 进阶 基本使用不能满足的情况 解决思路 问题一解决:(有两种思路) 问题二解决: Tokenizer 中的 Encoder vocab_base 部分 vocab_add ...

  3. Hugging Face 的 Transformers 库快速入门 (一)开箱即用的 pipelines

    注:本系列教程仅供学习使用, 由原作者授权, 均转载自小昇的博客 . 文章目录 前言 开箱即用的 pipelines 情感分析 零训练样本分类 文本生成 遮盖词填充 命名实体识别 自动问答 自动摘要 ...

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

    同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深 ...

  5. 【学习笔记】Transformers库笔记

    库API文档: https://huggingface.co/transformers/ 版本号: 4.3.0 序言 Transformers库应该算是一个比较新的项目,截至2021年3月2日,当中已 ...

  6. Huggingface Transformers简约教程(二)

    写在前面: 致敬所有前辈: ① 知乎上的transformers 教程 ② 博客园上的Colab 使用教程 ③ huggingface 官网 6 设计思想 The library was design ...

  7. 2023年的深度学习入门指南(5) - HuggingFace Transformers库

    2023年的深度学习入门指南(5) - HuggingFace Transformers库 这一节我们来学习下预训练模型的封装库,Hugging Face的Transformers库的使用.Huggi ...

  8. Hugging Face官方NLP课程来了!Transformers库维护者之一授课,完全免费

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自:机器之心 编辑:杜伟 Hugging Face NLP 课程开 ...

  9. Hugging Face官方课程来了!Transformers库维护者之一授课,完全免费

    作者 | 杜伟 来源 | 机器之心 Hugging Face NLP 课程开课了,所有课程完全免费. NLP 领域的小伙伴应该都非常熟悉大名鼎鼎的 Hugging Face,这家专注于解决各种 NLP ...

最新文章

  1. 您的手机上未安装应用程序 android 点击快捷方式提示未安装程序的解决
  2. python无法启动此程序因为计算机中丢失_python报错:无法启动此程序,因为计算机中丢失...
  3. html5 将资源存于客户端,HTML5离线应用与客户端存储的实现
  4. [SDOI2006] 保安站岗
  5. JAVA基本数据类型和引用数据类型的参数传递详解
  6. CodeFileBaseClass 属性
  7. bpsk调制及解调实验_无线通信中的IQ调制,BPSK调制,QPSK调制,16QAM调制的理解...
  8. java spring 多数据库_java – 使用多个数据源/数据库的Spring-Hibernate
  9. javaBean和jsp应用
  10. Thinking in ReactJS and Flux
  11. 使用setuptools和cython打包python程序的时候遇到:Microsoft visual c++ 14.0 is required问题解决办法
  12. 黑客声称攻陷并加密白俄罗斯国家铁路的服务器
  13. oracle不显示表和过程,oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题...
  14. [JNI]开发之旅(7)JNI函数中调用java对象的方法
  15. xp系统怎样添加桌面计算机,如何为XP系统计算机设置桌面
  16. innosetup 安装前、卸载前判断是否有进程正在运行转
  17. 计算机视觉的一些测试数据集和源码站点
  18. F4驱动WM8978“前奏
  19. Python实现视频中的音频提取
  20. cpu天梯图2022 cpu性能排行榜2022最新版

热门文章

  1. 12无法使用otg_ios设备该如何选择U盘,以及U盘日常使用技巧
  2. wmic 获取计算机ip,【已解决】xp系统下,受限用户如何用批处理在不使用wmic获取多个网卡的IP地址?...
  3. android 之开关控件的使用
  4. 详细分解Transformer各部件总结
  5. C ++ 函数模板求三个数的最大和
  6. C++中的RAII机制
  7. numpy.tile 阵列
  8. 登录 googlecloud,链接数据库
  9. 进制转换c++代码_跟小黑学漏洞利用开发之16进制字符转换
  10. tensorflow就该这么学--4(识别手写数字)