技术标签: transformers 深度学习 自然语言处理
在之前提到过,标记器(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)
文章浏览阅读104次。跟一夫学UI设计 APPUI综合设计与图标实战案例视频教程 photoshop绘制icon案例 ..._app风格案例视频
文章浏览阅读4k次,点赞4次,收藏22次。1. 下载并安装海康 web 插件https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=102. 把上一步解压的三个 js, 复制到你的项目中, 根据路径, 自己引入到 index.html 中3. 建议运行它的 demo, 大概看看代码, 了解一下它的大致结构, 它的注解很详细, 3 分钟就能看完4. 贴上我的代码(我的是每次只显示一个画面, 点击摄像头切换画面)<temp.._vue-hkvideo
文章浏览阅读5.3k次,点赞3次,收藏4次。很多时候需要用到这个css效果,实际上就用了一个li标签的热点样式,不仅是li标签,div等也可以的完整代码如下,div/css鼠标热点改变li标签背景颜色body{ background-color:#CCCC99; margin:0; padding:0; color:#fff;}ul{ margin:0; padding:50px;}li{ list-style:none; height:2..._ul li 样式 鼠标移入颜色
文章浏览阅读238次,点赞4次,收藏8次。把删除创建为rm -i 的别名当 -i 选项配合 rm 命令(也包括其他文件处理命令比如 cp 或者 mv)使用时,在删除文件前会出现一个提示。其中,/home/gacanepa/rescued 是另外一个磁盘中的目录 - 请记住,把文件恢复到被删除文件所在的磁盘中不是一个明智的做法。安装完成后,我们做一个简单的测试吧。如果在恢复过程中,占用了被删除文件之前所在的磁盘分区,就可能无法恢复文件。但愿你对于你的文件足够小心,当你要从外部磁盘或 USB 设备中恢复丢失的文件时,你只需使用这个工具即可。
文章浏览阅读3.2w次。<Window x:Class="Zhaoxi.BindingStudy.DataFormatStudy.DataFormatStudyWin" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.._wpf 自定义属性绑定 格式化 实现
文章浏览阅读1.1w次,点赞3次,收藏5次。转载请说明来源于"厦门SEO"本文地址:http://www.96096.cc/Article/160880.html常用办公软件 WPS Office是由金山软件股份有限公司开发的一款针对个人永久免费的办公软件,在我们的日常生活和工作中,WPS Office比起微软Microsoft Office来说在文字上的处理会更深入国人用户的人心,熟悉操作WPS的办公小技巧,能够更高效的提高我们的工作效率,今天小编要为大家分享的是WPS怎么自动生成目录?快来一起看看WPS自动生成目录的设置教程吧。_wps目录自动生成
要能够将 API 调用的响应本地存储到缓存中,首先,我们需要定义缓存并通知客户端。在下面的代码片段中,我们使用 okhttp 库中的 Cache 类定义了缓存。我们将此缓存的最大大小设置为 5 MB。然后,在初始化 okhttpclient 参数时使用cache()函数。.build()如果设备连接到互联网:如果最后一次 API 响应是在不到 30 分钟之前检索的,则显示缓存的响应;否则,获取新的响应并将其存储在缓存中。如果设备离线:使用最多 1 天前的 API 响应以保持应用程序功能。
而其较为出众的一点,就是较好的可拓展性,即丰富的插件应用,这些应用可以极大地提高生产效率,并优化日常使用。可以发现,其整体格局和我们常见的流程图编辑应用较为类似,其主题颜色也与我们的VS Code保持一致,在这里为了编辑方便,我们还是将编辑器主题改为浅色。当然,其功能仍存在局限,不能够完全代替我们传统的图形绘制工具,但也可以作为我们日常工作的有益补充,帮助我们完成一些特定情景下的项目。整体布局也十分明晰,与我们常用的Visio极为类似:左侧为形状选项卡,中间为画布容器,右侧为样式编辑。
之前在说了我的第一版静态资源代理,后面我又完善了一下:照着以上思路,可以在其他语言其他框架中实现,因为对框架没有依赖,都是使用的一些基本功能。
文章浏览阅读338次,点赞4次,收藏6次。架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在Android里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。此时,RecyclerView第一个item是添加进Adapter中的最后一个,最后一个item是第一个加进Adapter的数据,RecyclerView会自动滑到末尾,另外item整体是依靠下方的。
文章浏览阅读884次。使用多种方式实现接口幂等性,通过定义注解方便对方法进行幂等性控制
文章浏览阅读324次。SpringBoot、Swagger2 整合详解_springboot swagger2 开关