快速入门
用一个简单的例子来示意,文本分类
安装
pip install transformers
示例——情感分析
以下均为python代码,我是放在jupyter中写的
from transformers import pipeline
pipe = pipeline("text-classification")
res = pipe("just so so!")
print(res)
# [{'label': 'POSITIVE', 'score': 0.9974353909492493}]
- 注意:
- pipeline() 方法指定任务和加载模型的,返回的对象可以用来做具体的事。
- pipe() 方法在此时传入的是你要分类的文本
- pipeline() 方法支持传入不同的参数,用来指定不同的任务,具体内容见下表。
- 在执行pipeline时,代码会自动从huggingface.co中下载模型到本地,这个例子中,使用的模型是distilbert-base-uncased-finetuned-sst-2-english。同时也可以自定义模型,只需要传入model参数即可。如果想从本地加载模型,可下载完模型后,直接填写本地模型地址,这个后续会提到。
pipeline中的参数值得是任务类型,可以传入如下类型。 |任务|描述|模态|Pipeline| |---|---|---|---| |文本分类|为给定的文本序列分配一个标签|NLP|pipeline(task=“text-classification”)| |文本生成|根据给定的提示生成文本|NLP|pipeline(task=“text-generation”)| |命名实体识别|为序列里的每个token分配一个标签(人, 组织, 地址等等)|NLP|pipeline(task=“ner”)| |问答系统|通过给定的上下文和问题, 在文本中提取答案|NLP|pipeline(task=“question-answering”)| |掩盖填充|预测出正确的在序列中被掩盖的token|NLP|pipeline(task=“fill-mask”)| |文本摘要|为文本序列或文档生成总结|NLP|pipeline(task=“summarization”)| |文本翻译|将文本从一种语言翻译为另一种语言|NLP|pipeline(task=“translation”)| |图像分类|为图像分配一个标签|Computer vision|pipeline(task=“image-classification”)| |图像分割|为图像中每个独立的像素分配标签(支持语义、全景和实例分割)|Computer vision|pipeline(task=“image-segmentation”)| |目标检测|预测图像中目标对象的边界框和类别|Computer vision|pipeline(task=“object-detection”)| |音频分类|给音频文件分配一个标签|Audio|pipeline(task=“audio-classification”)| |自动语音识别|将音频文件中的语音提取为文本|Audio|pipeline(task=“automatic-speech-recognition”)| |视觉问答|给定一个图像和一个问题,正确地回答有关图像的问题|Multimodal|pipeline(task=“vqa”)| |文档问答|给定一个图像和一个问题,正确地回答有关文档的问题|Multimodal|pipeline(task=“document-question-answering”)| |图像字幕|给定图像,生成标题|Multimodal|pipeline(task=“image-to-text”)|
原理
接下来,我们分步来看一下这个pipeline() 方法做了哪些事。pipeline:顾名思义,流水线/管道的意思,就是让AI的调用像流水线一样简单。以上文中的文本分类为例,讲述整个pipeline的流程:
-
原理图
-
代码实现
from transformers import AutoTokenizer,AutoModel
import torch
# 加载分词器和模型,这里要指定从哪个模型加载分词器模型,使用上文提到的
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
# 使用分词器对句子进行处理
seq = "just so so!"
input_text = "just so so!"
inputs = tokenizer(input_text, return_tensors="pt")
print(inputs)
# 输出结果如下 {'input_ids': tensor([[ 101, 2074, 2061, 2061, 999, 102]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]])}
# 将分词结果传入model进行预测
res = model(**inputs)
# 对预测结果映射到二维(因为我们做的事二分类问题)
logits = torch.softmax(res.logits, dim=-1)
print(logits) # tensor([[0.0026, 0.9974]])
pred = torch.argmax(logits).item()
print(pred) # 1
# 此时输出的pred为0或者1,需要进行映射,才能返回之前返回的 'label': 'POSITIVE'
# 查看一下model的配置id2label,可以发现1就是POSITIVE。当然就可以自定义这个配置的
print(model.config.id2label)
# {0: 'NEGATIVE', 1: 'POSITIVE'}
#映射输出
result = model.config.id2label.get(pred)
print(result) # POSITIVE
print(float(logits[0][1])) # 0.9974353909492493
评论区