2

Hugging Face 文档描述了如何使用 Bert 模型进行序列分类:

from transformers import BertTokenizer, BertForSequenceClassification
import torch

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')

input_ids = torch.tensor(tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)).unsqueeze(0)  # Batch size 1
labels = torch.tensor([1]).unsqueeze(0)  # Batch size 1
outputs = model(input_ids, labels=labels)

loss, logits = outputs[:2]

但是,只有批量大小 1 的示例。当我们有一个短语列表并想要使用更大的批量大小时,如何实现它?

4

1 回答 1

3

在该示例unsqueeze中,用于向输入/标签添加维度,使其成为 size 的数组(batch_size, sequence_length)。如果要使用大于 1 的批量大小,则可以构建一个序列数组,如下例所示:

from transformers import BertTokenizer, BertForSequenceClassification
import torch

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')

sequences = ["Hello, my dog is cute", "My dog is cute as well"]
input_ids = torch.tensor([tokenizer.encode(sequence, add_special_tokens=True) for sequence in sequences])
labels = torch.tensor([[1], [0]]) # Labels depend on the task
outputs = model(input_ids, labels=labels)

loss, logits = outputs[:2]

在该示例中,两个序列都以相同数量的标记进行编码,因此很容易构建包含两个序列的张量,但如果它们具有不同数量的元素,则需要填充序列并告诉模型它应该参加哪些标记到(以便它忽略填充值)使用注意掩码。

词汇表中有一个关于注意面具的条目,解释了它们的目的和用法。在调用模型的 forward 方法时,您将此注意掩码传递给模型。

于 2020-02-11T15:02:16.373 回答