Transformers是著名的深度学习预训练模型集成库,包含NLP模型最多,CV等其他领域也有,支持预训练模型的快速使用和魔改,并且模型可以快速在不同的深度学习框架间(Pytorch/Tensorflow/Jax)无缝转移。以下记录基于HuggingFace官网教程:https://github.com/huggingface/transformers/blob/main/README_zh-hans.md

任务调用

  直接使用两行代码实现各种任务,以下举例一个情感分析任务:

from transformers import pipeline
# 使用情绪分析流水线
classifier = pipeline('sentiment-analysis', 'distilbert-base-uncased-finetuned-sst-2-english')
classifier('We are very happy to introduce pipeline to the transformers repository.')

  pipeline第一个参数传入实现任务类型,第二个参数传入预训练模型权重名。模型预训练权重名中,distilbert-base表示使用模型蒸馏训练的base bert;uncased表示模型权重无法区分大小写,数据在传入前需要小写处理;finetuned-sst-2-english表示模型权重在英文Stanford Sentiment Treebank 2数据集上进行微调。如果权重名能在当前工作目录中找到,就读取当前工作目录的文件,否则就会去HuggingFace官网下载相应的Repository。如果自动下载失败,distilbert-base-uncased-finetuned-sst-2-english的模型权重和配置文件可以通过以下方式下载:

git lfs install
git clone https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english

  下载下来一个文件夹,其中包含模型结构文件 config.json、模型权重文件 model.safetensors、分词器配置文件 tokenizer_config.json、词表文件 vocab.txt等。文件夹中有时会包含文件分词器文件 tokenizer.json,其中保存了分词到id的映射。tokenizer.json的映射与vocab.txt正好相反,因此没有tokenizer.json照样可以运行。但是除了映射之外,tokenizer.json通常还会保存一些额外的关于特殊token或是未登录词的词频信息,是会影响模型结果的。

  如果通过git模型权重下载失败,可以直接进网站下载单个权重文件并放入文件夹。其中后缀为h5、weights、ckpt、pth、safetensors、bin的文件都是模型权重。比如pth是pytorch常用的权重后缀,h5是Tensorflow的常用的权重后缀。具体保存的格式不细究,只要任意下载一个就行。Transformers默认使用Pytorch,因此通常下载pth、bin或safetensors。

  通过以上API和下载的Repository文件,可以看出Transformers把用到的预训练模型、配置文件、分词等都放在一个repository中,从而在使用时实现模型结构的自动构建以及配套预训练权重的读取,从而无需显式使用Pytorch写好与预训练权重配套的结构代码,加快预训练模型使用流程。

预训练模型调用

  如果要研究模型的推理,而不是实现具体任务。可以实现为以下代码:

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") #1
model = AutoModel.from_pretrained("bert-base-uncased") #2
inp = tokenizer("Hello world!", return_tensors="pt") #3
outp = model(**inp)

  其中#1表示读取bert-base-uncased的分词器,#2表示读取bert-base-uncased的预训练权重并构建模型。如果模型权重只下载了h5,而使用Pytorch作为后端,则需要给from_pretrained添加from_tf=True参数。#3使用分词器对输入句子进行分词,输出pytorch张量。如果设置return_tensors="tf"则分词器输出兼容tensorflow模型的张量,此时model应该使用TFAutoModel来实例化。

  如果要处理批量数据,可以给分词器传入文本列表,如:

texts = ["Hello world!", "Hello, how are you?"]
inp = tokenizer(texts, return_tensors="pt", padding=True, truncation=True)

  如果给分词器传入两段文本,分词器将它们合并,并额外生成句子类型id,用于句子顺序判别任务。第一句token标识为0,第二句token标识为1:

texts = ["Hello world!", "Hello, how are you?"]
inp = tokenizer(*texts, return_tensors="pt", padding=True, truncation=True)

自定义模型推理

  观察config.json,其中architectures字段定义了所需预训练权重所需使用的模型结构类,可以发现其它的各字段就是传入该模型结构类的参数,从而能实例化出与预训练模型权重一致的模型结构,然后再读取权重得到预训练模型。那么我们可以根据这些文件以及Transformers内置的模型结构类(继承自nn.Module),来自定义模型的数据通路。将前面的情感分类管道分解如下:

from transformers import DistilBertTokenizer, DistilBertForSequenceClassification
from torch import nn text = "We are very happy to introduce pipeline to the transformers repository."
model_head_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = DistilBertForSequenceClassification.from_pretrained(model_head_name).to('cuda')
tokenizer = DistilBertTokenizer.from_pretrained(model_head_name)
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True).to('cuda') # 获取模型内 bert 主体的输出
distilbert_output = model.distilbert(**inputs)
# 使用 bert 输出的第一个token [CLS] 计算情感分类概率
hidden_state = distilbert_output[0] # (bs, seq_len, dim)
pooled_output = hidden_state[:, 0] # (bs, dim)
pooled_output = model.pre_classifier(pooled_output) # (bs, dim)
pooled_output = nn.ReLU()(pooled_output) # (bs, dim)
pooled_output = model.dropout(pooled_output) # (bs, dim)
logits = model.classifier(pooled_output) # (bs, num_labels)
print("Positive rate: ", nn.Softmax(1)(logits)[0,1].detach().cpu().numpy())

Transformers包使用记录的更多相关文章

  1. npm包发布记录

    下雪了,在家闲着,不如写一个npm 包发布.简单的 npm 包的发布网上有很多教程,我就不记录了.这里记录下,一个复杂的 npm 包发布,复杂指的构建环境复杂. 整个工程使用 rollup 来构建,其 ...

  2. centos 系统程序包安装记录

    -添加sudoer su - vi /etc/sudoers 在root ALL=(ALL) ALL 下添加: pete ALL=(ALL) ALL -安装拼音: sudo yum install & ...

  3. WEB应用打成jar包全记录

    内容属原创,转载请注明出处 题外 由于项目的需求—不管是怎么产生的这个需求—总之,需要支持把一个web应用打成jar包供其他应用使用,这就有了下面的过程. 这个过程里用到了Spring和SpringM ...

  4. hadoop出现error包问题记录

    前段时间,我公司发现大部分hadoop服务器有重传数据包和error包现象,且重传率经常超过1%.zabbix告警hadoop主机有error包出现.收到大量类似如下告警信息: Trigger: et ...

  5. 手机网络抓包 转载记录http://blog.csdn.net/skylin19840101/article/details/43485911

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的HTTP/HTTPS请求.Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook. ...

  6. linux下安装rabbitmq的rpm包问题记录

    安装rabbitmq的文章和帖子多如牛毛,不管是官网还是各个博客,这里附个Rabbitmq官网安装Rpm包的链接, http://www.rabbitmq.com/install-rpm.html 不 ...

  7. fiddler 手机抓包,CS端抓包 使用记录

    1.允许远程连接 2.忽略https证书错误 3.设置代理 4.重启fiddle 5.PC客户端抓包分工具FIddler+Proxifer https://blog.csdn.net/sunbo_cs ...

  8. R包开发过程记录

    目的 走一遍R包开发过程,并发布到Github上使用. 步骤 1. 创建R包框架 Rsutdio --> File--> New Project--> New Directory - ...

  9. 【http抓包】记录一次抓手机app的接口

    抓手机的接口地址,好用的工具很多,想 windows下的 Fiddler 和mac下的Charles 1. fiddler的设置教程是 http://jingyan.baidu.com/article ...

  10. 用到的一些python包,记录下

    Requests beautifulsoup lxml logging gevent django Bottle numpy pandas sklearn pyopencv opencv_python ...

随机推荐

  1. 【Python】之pip安装报错问题:WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))

    我想安装python第三方库,但是始终报安装失败 经查询得知,需要国内源,有如下地址: 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https: ...

  2. 关于人工智能的思考,写在chatGPT爆火之时

    今天是2023年3月22日,今天思维比较活跃,故作文一篇,以记录当下所想. 先是回家询问了未婚妻的想法,然后记录自己的想法. 未婚妻的想法: 1.在AI领域已经滞后于世界了.因为在墙头上看到过一个加拿 ...

  3. 用CSS border画一个铅笔

    先上效果图 该例子来自 CSS世界 的书中项目 总结技巧如下: 巧用 border 和 伪元素 来 绘制层叠效果. 使用 transform-origin 来改变元素的轴心 使用 filter:dro ...

  4. web前端使用mcg-helper代码生成工具学习笔记

    学习资料介绍 github地址:mcg-helper代码生成工具 什么是 FreeMarker? - FreeMarker 中文官方参考手册 视频学习地址: 第一节.视频教程内容介绍   探讨研发工作 ...

  5. JavaScript – Temporal API & Date

    前言 Temporal API 是 JS 的新东西,用来取代 Date.虽然现在 (12-09-2024) 依然没有任何游览器支持 Temporal API,但它已经是 stage 3 了,而且有完整 ...

  6. JavaScript – Symbol

    前言 Symbol 是 es6 的特性. 如果只是写业务逻辑代码, 其实是不太会用到的. 如果是做架构, 封装, UI 组件才有需要. 但学它的概念是好的. es6 有需要内置的 Symbol 链接者 ...

  7. Shiro-认证绕过漏洞(CVE-2020-1957)

    漏洞原理 核心点就是shiro和spring对uri进行配合匹配的时候有缺陷导致的,shiro中很轻易就能绕过,其次spring中对;分号好像情有独钟,被大牛们发现后也就一下子绕过了. 主流paylo ...

  8. postgre基于行数的外连接及python连接postgre数据库

    外连接 左外/右外连接 左外连接:左表全部出现在结果集中,若右表无对应记录,则相应字段为NULL left join ... on 条件 右外连接:右表全部出现在结果集中,若左表无对应记录,则相应字段 ...

  9. [R18][中国語翻訳]HDKのABC370赛試(ABC370)

    A.Raise Both Hands \(\texttt{Diff }11\) #include<bits/stdc++.h> using namespace std; #define e ...

  10. Autodesk 3d Max2020 初始化闪退

    事件起因:给同事安装完 Autodesk 3d Max2020 版本之后,软件初始化就闪退,后来在网上查了资料后解决. 解决办法如下:services.msc --> Autodesk 开头的服 ...