如何在 Bert 序列分类中使用大于零的批量大小
How to use a batch size bigger than zero in Bert Sequence Classification
Hugging Face documentation describes如何使用 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]
但是只有batch size 1的例子,当我们有一个短语列表,想要使用更大的batch size时,如何实现?
在该示例中 unsqueeze
用于向 input/labels 添加一个维度,因此它是一个大小为 (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]
在该示例中,两个序列都使用相同数量的标记进行编码,因此很容易构建包含两个序列的张量,但如果它们具有不同数量的元素,则需要填充序列并告诉模型它应该使用注意掩码关注哪些标记(以便它忽略填充的值)。
glossary 中有一个条目涉及注意遮罩,解释了它们的用途和用法。您在调用它的 forward 方法时将此注意力掩码传递给模型。
Hugging Face documentation describes如何使用 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]
但是只有batch size 1的例子,当我们有一个短语列表,想要使用更大的batch size时,如何实现?
在该示例中 unsqueeze
用于向 input/labels 添加一个维度,因此它是一个大小为 (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]
在该示例中,两个序列都使用相同数量的标记进行编码,因此很容易构建包含两个序列的张量,但如果它们具有不同数量的元素,则需要填充序列并告诉模型它应该使用注意掩码关注哪些标记(以便它忽略填充的值)。
glossary 中有一个条目涉及注意遮罩,解释了它们的用途和用法。您在调用它的 forward 方法时将此注意力掩码传递给模型。