目录
1 什么是Pipeline

2 Pipeline支持的任务类型

可以通过“from transformers.pipelines import SUPPORTED_TASKS”进行查看。

3 Pipeline的创建:
注意,我们使用的是Jupiter(猪皮特),故以下代码皆为部分代码。
1)根据任务类型直接创建,不自己指定模型,使用该类任务默认模型:
pipe = pipeline("text-classification")
pipe(["very good!", "vary bad!"])
2)指定任务类型,接着继续指定具体模型:
模型链接:Huggingface官网
pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
pipe("我很开心哦!")
3)预先加载模型和分词器,接着再创建Pipeline
# 这种方式,必须同时指定model和tokenizer
model = AutoModelForSequenceClassification.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
pipe = pipeline("text-classification", model=model, tokenizer=tokenizer)
pipe("我觉得不太行!")
4 关于Pipeline的执行设备:
1)查看当前pipeline执行设备:
pipe.model.device
2)粗略估计执行时间:
import torch
import time
times = []
for i in range(100):
torch.cuda.synchronize()
start = time.time()
pipe("我觉得不太行!")
torch.cuda.synchronize()
end = time.time()
times.append(end - start)
print(sum(times) / 100)
3)使用GPU进行推理
pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese", device=0)
#后边的数字0表示选取第0块显卡,没有该参数则默认采用cpu训练
5 确定Pipeline参数:
有那么多模型,我们怎么知道该如何设置它的参数呢?
1)首先我们可以参考官网的教程;
2)其次就是我们可以跳到所用模型的定义去查阅samples;
qa_pipe = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
qa_pipe
#生成<transformers.pipelines.question_answering.QuestionAnsweringPipeline at 0x2f42d953d30>
#接着复制我们使用的模型到代码框QuestionAnsweringPipeline,进入其定义
3)也可以通过help的方式在控制台查看:
from transformers.pipelines.question_answering import QuestionAnsweringPipeline
help(QuestionAnsweringPipeline)
6 其他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
#对图片内容进行零样本预测
predictions = detector(
im,
candidate_labels=["hat", "sunglasses", "orange"],
)
predictions
#绘制预测框
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

7 Pipeline的背后实现(以文本分类为例):

# 准备数据(文本)
input_text = "我觉得不太行!"
# 初始化Tokennizer
inputs = tokenizer(input_text, return_tensors="pt")
inputs
# 初始化model
from transformers import *
import torch
tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
model = AutoModelForSequenceClassification.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
# 模型预测
res = model(**inputs)
res
# 得到预测部分的内容,经过一个softmax层归一化为0-1,化为概率
logits = res.logits
logits = torch.softmax(logits, dim=-1)
logits
# 得到类别
pred = torch.argmax(logits).item()
pred
# 映射回去,得到直观结果
result = model.config.id2label.get(pred)
result
1)原始数据:
“我觉得不太行!”
2)经过tokenizer 后:
{
'input_ids': tensor([[ 101, 2769, 6230, 2533, 679, 1922, 6121, 8013, 102]]),
'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0]]),
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1]])
}这是一个字典对象,其中包含三个键值对:
'input_ids':输入文本被转换为对应的token ID序列。'token_type_ids':用于区分不同句子或片段的标识符,该示例中为单句文本,因此所有标识符都为0。'attention_mask':用于指示哪些位置的token需要被注意,该示例中所有位置都被注意到(值为1)。
3)经过模型训练后的结果
SequenceClassifierOutput(
loss=None,
logits=tensor([[ 1.7376, -1.8681]], grad_fn=<AddmmBackward0>),
hidden_states=None,
attentions=None
)
loss:损失值,表示模型在训练过程中的损失。损失值为None,表示没有计算损失。logits:模型的输出logits。它是一个张量(tensor),其中包含模型对每个类别的分数或概率。logits的值为tensor([[ 1.7376, -1.8681]])。hidden_states:隐藏状态。隐藏状态为None,表示没有返回隐藏状态。attentions:注意力权重。注意力权重为None,表示没有返回注意力权重。
4)经过Softmax层
tensor([[0.9736, 0.0264]], grad_fn=<SoftmaxBackward0>)
得到归一化概率分布
5)取最大概率的下标,得到类别
0 #其中0表示负类,1表示正类

6)映射回去,得到直观结果
'negative (stars 1, 2 and 3)'
将上述一整个东西封装好,就是一个Pipeline。

2059

被折叠的 条评论
为什么被折叠?



