实战Transformers-【基础知识与环境安装】Day 2
基础组件之Pipeline
什么是Pipeline
- Pipeline
将数据预处理、模型调用、结果后处理三部分组装成的流水线
使我们能够直接输入文本便获得最终的答案
数据进来先经过Tokenizer做数据预处理然后进到模型里面去做调用最后再去经过一个后处理得到结果
比如下面这句话转成id然后要经过模型去预测得到logic,两个分数,再去做softmax,最终得到positive或negative及它的分数
这个的话就是流水线的一个工作,我们可以简单的去调用一个流水线,然后去完成各个模型的推理而且不需要我们去关注细节,直接把我们的输入文本塞进去就可以了
Pipeline支持的任务类型
Pipeline支持的任务类型如下
下面通过代码来去看一下
首先是导入库,发现要更新
使用pip install -U xxx
更新就不会报错了
Pipeline的创建与使用
根据任务类型直接创建Pipeline, 默认都是英文的模型
from transformers import *
pipe = pipeline("text-classification")
调用pipeline的话直接把它输进去
pipe("very good!")
直接出结果:
指定任务类型,再指定模型,创建基于指定模型的Pipeline
使用hugging face
在hugging face里可以找到需要的模型
进入模型里面找到how to use可以教你怎么用
像这样就是自己先加载好然后再创建pipeline,这里注意的是如果采用了这种,也就是预先加载模型然后分词器也自己加载的这种方式,你必须同时指定模型和分词器,不然就会报错
也可以直接复制
# https://huggingface.co/models
pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
pipe("我很棒!")
不过如上都是在cpu里面运行的
使用gpu进行推理
pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese", device=0)
它会加载到我们的第0张显卡上,一定是数字的0!
确定Pipeline参数
比如问答
qa_pipe = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
这里我们不清楚它的参数,想找模型的使用样例,一种方式是看文档,另一种就是直接打印这个
qa_pipe
这样会有提示
然后可以输入QuestionAnsweringPipeline
,按住ctrl进入里面看,这里有个简单示例
详细的我们主要看这个call,上面说的是question和context两块,实际上这些都可以用
其他Pipeline示例
零样本目标检测
checkpoint = "google/owlvit-base-patch32"
detector = pipeline(model=checkpoint, task="zero-shot-object-detection")
使用的是官方的一张图片
import requests
from PIL import Image
url = "https://unsplash.com/photos/oj0zeY2Ltk4/download?ixid=MnwxMjA3fDB8MXxzZWFyY2h8MTR8fHBpY25pY3xlbnwwfHx8fDE2Nzc0OTE1NDk&force=true&w=640"
im = Image.open(requests.get(url, stream=True).raw)
im
直接调用detector
predictions = detector(
im,
candidate_labels=["hat", "sunglasses", "book"],
)
predictions
通过ImageDraw画出来
from PIL import ImageDraw
draw = ImageDraw.Draw(im)
for prediction in predictions:
box = prediction["box"]
label = prediction["label"]
score = prediction["score"]
xmin, ymin, xmax, ymax = box.values()
draw.rectangle((xmin, ymin, xmax, ymax), outline="red", width=1)
draw.text((xmin, ymin), f"{label}: {round(score,2)}", fill="red")
im
Pipeline的背后实现
Step1 初始化Tokenizer
tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
Step2 初始化Model
model = AutoModelForSeduenceClassification.from pretrained/"uer/roberta-base-finetuned-dianpinc-chinese"
Step3 数据预处理
input text ="我觉得不太行!"
inputs = tokenizer(input text, return tensors="pt")
Step4 模型预测
res = model(**inputs).logits
Step5 结果后处理
pred = torch.argmax(torch.softmax(logits, dim=-1)).item()
result = model.config.id2label.get(pred)
学习视频地址:【手把手带你实战HuggingFace Transformers-入门篇】基础组件之Pipeline
项目地址:github