基于HF Transformer的NLP实践的练习答案#
练习1答案#
from transformers import pipeline
# 1. 加载模型和分词器
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
sentiment_analysis = pipeline("sentiment-analysis", model=model_name, tokenizer=model_name)
# 2. 输入文本
text = "I absolutely love this new phone!"
# 3. 进行情感分析
result = sentiment_analysis(text)
# 4. 输出结果
print("情感分析结果:", result)
输出:
情感分析结果: [{'label': '5 stars', 'score': 0.962716281414032}]
模型认为该句子表达了非常正面的情感,其中 ‘5 stars’ 表示最高情感评级,得分 0.962 表示模型对此预测的置信度为 96.27%。
练习2 答案#
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# 1. 加载模型和分词器
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. 准备输入
text = "I absolutely love this new phone!"
inputs = tokenizer(text, return_tensors="pt")
# 3. 模型推理,获取 logits
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
# 4. 将 logits 转换为概率
probs = torch.softmax(logits, dim=-1)
# 5. 找到概率最大的标签
pred_label_idx = torch.argmax(probs, dim=-1).item()
label_names = model.config.id2label
pred_label = label_names[pred_label_idx]
# 输出结果
print("Logits:", logits)
print("Probabilities:", probs)
print("Predicted label index:", pred_label_idx)
print("Predicted label:", pred_label)
输出:
Logits: tensor([[-2.0808, -2.6891, -1.3933, 0.9046, 4.3200]])
Probabilities: tensor([[1.5983e-03, 8.6986e-04, 3.1786e-03, 3.1637e-02, 9.6272e-01]])
Predicted label index: 4
Predicted label: 5 stars
解释:#
加载模型和分词器
model_name:指定了要加载的模型名称。在这里,使用的是一个多语言的 BERT 模型,专门用于情感分析任务。
model = …:通过
from_pretrained
方法加载预训练的情感分类模型,该模型已经在大量数据上进行过训练,能对文本情感进行判断。tokenizer = …:加载与模型对应的分词器,确保输入文本的编码格式与模型一致。
模型推理,获取 logits
logits 是模型输出的原始值,它是每个类别的得分(score),尚未进行概率转换(未经过softmax函数处理),每个类别的logit越大,表示模型越倾向预测为对应的标签。
举个简单的例子: 假设模型预测三个类别(积极、中性、消极), logits 为
[3.2, -1.1, 0.5]
表示模型更倾向于第一个类别(积极)。with torch.no_grad():在推理过程中禁用梯度计算,这样可以节省内存并提高推理速度,因为这里不需要反向传播计算梯度。
outputs = model (inputs):将编码后的输入数据传入模型,得到模型的输出。
logits = outputs.logits:从输出中提取 logits,logits 是模型在各个类别上的原始预测分数(未归一化)。
将 logits 转换为概率
torch.softmax:对 logits 进行 softmax 操作,转换成概率分布。这里的
dim=-1
表示在最后一个维度上应用 softmax(即每个样本在所有类别上的概率和为 1)通过分类头输出 logits:
比如
[1.1, 0.3, -0.5, 0.2, 4.2]
softmax后转化为概率:
比如
[0.04, 0.02, 0.01, 0.03, 0.91]
找到概率最大的标签
torch.argmax(probs, dim=-1):找到概率最高的类别索引,代表模型的预测结果。调用 .item() 将单个张量转换为 Python 的数值类型。
model.config.id2label:从模型配置中获取索引到标签的映射字典。
pred_label:利用映射字典,将预测的索引转换为具体的标签名称(例如情感等级)。