Fork me on GitHub

实战Transformers-【基础知识与环境安装】Day 2

基础组件之Pipeline

什么是Pipeline

  • Pipeline
    将数据预处理、模型调用、结果后处理三部分组装成的流水线
    使我们能够直接输入文本便获得最终的答案

数据进来先经过Tokenizer做数据预处理然后进到模型里面去做调用最后再去经过一个后处理得到结果
比如下面这句话转成id然后要经过模型去预测得到logic,两个分数,再去做softmax,最终得到positive或negative及它的分数
这个的话就是流水线的一个工作,我们可以简单的去调用一个流水线,然后去完成各个模型的推理而且不需要我们去关注细节,直接把我们的输入文本塞进去就可以了

image

Pipeline支持的任务类型

Pipeline支持的任务类型如下

image

下面通过代码来去看一下

首先是导入库,发现要更新

image

使用pip install -U xxx更新就不会报错了

Pipeline的创建与使用

根据任务类型直接创建Pipeline, 默认都是英文的模型

from transformers import *
pipe = pipeline("text-classification")

调用pipeline的话直接把它输进去

pipe("very good!")

直接出结果:

image

指定任务类型,再指定模型,创建基于指定模型的Pipeline

使用hugging face

image

在hugging face里可以找到需要的模型
进入模型里面找到how to use可以教你怎么用

image

像这样就是自己先加载好然后再创建pipeline,这里注意的是如果采用了这种,也就是预先加载模型然后分词器也自己加载的这种方式,你必须同时指定模型和分词器,不然就会报错
也可以直接复制

image

# https://huggingface.co/models
pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
pipe("我很棒!")

不过如上都是在cpu里面运行的

image

使用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

image

这样会有提示
然后可以输入QuestionAnsweringPipeline ,按住ctrl进入里面看,这里有个简单示例

image

详细的我们主要看这个call,上面说的是question和context两块,实际上这些都可以用

image

其他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

posted @ 2023-11-11 17:45  会自愈的哈士奇  阅读(148)  评论(0编辑  收藏  举报