transformers库的使用!🐈

transformers库的使用

1、加载预训练模型

例如,加载一个预训练的BERT模型,并查看一些关键的参数信息,可以使用以下代码:

1
2
3
4
5
from transformers import BertModel

# 加载预训练模型,会自动下载
model = BertModel.from_pretrained("bert-base-uncased")
print(model.config)

1.from transformers import BertModel:这一行从Transformers库中导入BertModel类。Transformers库是Hugging Face公司开发的一个用于处理自然语言处理(NLP)任务的库。BertModel类是用于表示BERT模型的基本架构的类。

2.model = BertModel.from_pretrained("bert-base-uncased"):这一行加载一个预训练的BERT模型。from_pretrained()方法是一个类方法,它根据给定的预训练模型名称(在这里是”bert-base-uncased”)自动下载并加载相应的模型权重。”bert-base-uncased”是BERT模型的一个变体,它使用小写字母进行训练,具有较小的模型大小和计算复杂度。加载完成后,model变量将包含一个可以用于各种NLP任务的预训练BERT模型。

3.print(model.config):这一行打印模型的配置信息。model.config是一个包含模型配置(例如模型架构、隐藏层大小、注意力头数等)的对象。通过打印这些信息,你可以了解模型的详细配置。

2.Tokenizer的使用

在使用预训练模型处理文本之前,我们需要将文本转换为模型可以理解的格式。这就需要使用tokenizer对文本进行分词、编码等操作。transformers库为每种预训练模型提供了相应的tokenizer类,使用方法非常简单。

例如,使用BERT的tokenizer进行文本编码,可以使用以下代码:

1
2
3
4
5
6
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
text = "here is some text to encode"
encoded_input = tokenizer(text, return_tensors='pt')
print(encoded_input)

tokenizer 是用于将文本数据转换为模型可接受的输入格式的工具。在 Hugging Face Transformers 库中,tokenizer 的参数通常有很多,下面是一些常用的参数及其作用:

  1. text:要编码的文本数据。
  2. return_tensors:指定返回的张量类型,通常为 'pt'(PyTorch)或 'tf'(TensorFlow)。如果不指定,默认返回 Python 列表格式。
  3. padding:指定是否对输入序列进行填充,通常为 'max_length'(填充到指定的最大长度)或 'longest'(填充到最长样本的长度)。如果不需要填充,可以设置为 False
  4. truncation:指定是否对输入序列进行截断,通常为 'max_length'(截断到指定的最大长度)或 'only_first'(仅截断第一个序列)等。如果不需要截断,可以设置为 False
  5. max_length:指定输入序列的最大长度,超出该长度的序列将被截断或填充。
  6. return_attention_mask:指定是否返回注意力掩码(attention mask),用于标记输入序列中的填充部分。如果为 True,则返回一个二进制张量,表示哪些位置是填充的,哪些是真实的输入。
  7. return_offsets_mapping:指定是否返回偏移映射(offsets mapping),用于将编码后的序列映射回原始文本中的字符位置。
  8. return_token_type_ids:指定是否返回令牌类型 ID,用于区分不同的句子。通常在处理句子对时使用,比如问答任务或文本对分类任务。
  9. add_special_tokens:指定是否添加特殊令牌(如 [CLS][SEP])到输入序列中。

tips:

1
2
3
4
5
6
7
8
9
tokenized_input = tokenizer.encode(sentence, add_special_tokens=True, return_tensors="pt")
tokenized_input1 = tokenizer(sentence, add_special_tokens=True, return_tensors="pt")

#分别使用:
with torch.no_grad():
outputs = model(tokenized_input)
outputs1 = model(**tokenized_input1)

#结果一致

3.文本分类任务示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from transformers import BertForSequenceClassification
from transformers import BertTokenizer
import torch

# 准备输入文本和对应的标签
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
input_text = ["I love this movie!", "This movie is terrible."]
labels = [1, 0] # 1表示正面情感,0表示负面情感

# 使用tokenizer对输入文本进行编码:将文本转换为模型可以理解的向量(input_ids和attention_mask)
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
encoded_inputs = tokenizer(input_text, padding=True, truncation=True, return_tensors="pt")

# 将编码结果输入到模型中,得到分类结果:
with torch.no_grad():
outputs = model(**encoded_inputs)
logits = outputs.logits
# 对logits进行argmax操作,得到预测的类别
predictions = torch.argmax(logits, dim=-1)

print(predictions)
  1. with torch.no_grad()::这是一个上下文管理器,它在其内部的代码块中禁用梯度计算。这在评估或推理阶段(而非训练阶段)使用模型时非常有用,因为它可以减少内存使用并提高计算速度。

  2. 对模型的原始输出更感兴趣,而不是将其转换为概率分布。在这种情况下,我们可以直接使用 logits。此外,如果我们只关注模型对每个类别的相对置信度,而不需要概率值,也可以直接使用 logits。(logits是值的大小,没有进行归一化的概率计算,softmax进行了归一化的概率计算

    因此,在使用模型输出时,要根据具体任务和需求来决定是否进行 softmax 处理。如果需要概率分布或进行后续的概率计算(如交叉熵损失计算),则需要对 logits 进行 softmax 处理;如果只需要模型的原始输出或对置信度进行比较,则可以直接使用 logits

  3. outputs.logits = outputs[0]

4.对模型进行微调与保存


transformers库的使用!🐈
https://yangchuanzhi20.github.io/2024/04/28/人工智能/NLP/库的使用/transformers库的使用/
作者
白色很哇塞
发布于
2024年4月28日
许可协议