1.2 基础组件之Pipeline

目录

1 什么是Pipeline

2 Pipeline支持的任务类型

3 Pipeline的创建:

4 关于Pipeline的执行设备:

5 确定Pipeline参数:

6 其他Pipeline示例(以目标检测为例):

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


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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值