0

transformers我正在尝试通过在库中使用 Trainer API 来微调/预训练现有的 BERT 模型以进行情绪分析。我的训练数据集如下所示:

Text                             Sentiment
This was good place                  1
This was bad place                   0

我的目标是能够将情绪分类为正面/负面。这是我的代码:

from datasets import load_dataset
from datasets import load_dataset_builder
import datasets
import transformers
from transformers import TrainingArguments
from transformers import Trainer

dataset = load_dataset('csv', data_files='my_data.csv', sep=';')
tokenizer = transformers.BertTokenizer.from_pretrained("bert-base-cased")
model = transformers.BertForMaskedLM.from_pretrained("bert-base-cased") 
print(dataset)
def tokenize_function(examples):
    return tokenizer(examples["Text"], examples["Sentiment"], truncation=True)

tokenized_datasets = dataset.map(tokenize_function, batched=True)
training_args = TrainingArguments("test_trainer")
trainer = Trainer(
    model=model, args=training_args, train_dataset=tokenized_datasets
)
trainer.train()

这会引发错误消息:

ValueError: text input must of type `str` (single example), `List[str]` (batch or single pretokenized example) or `List[List[str]]` (batch of pretokenized examples).

我做错了什么?任何建议都受到高度赞赏。

4

1 回答 1

0

您需要注意以下几点才能使您的代码正常工作。

首先,您正在处理序列分类任务,特别是二进制分类,因此您需要相应地实例化您的模型:

# replace this:
# model = transformers.BertForMaskedLM.from_pretrained("bert-base-cased")
# by this:
model = transformers.BertForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2)

您不应该将标签 ( examples["Sentiment"]) 提供给标记器,因为它们不需要被标记:

# use only the text as input 
# use padding to standardize sequence length
return tokenizer(examples["Text"], truncation=True, padding='max_length')

说到标签,您的培训师会希望它们出现在名为“标签”的列中,因此您必须相应地重命名您的“情绪”。请注意,此方法不会像您预期的那样就地运行,它会返回您必须捕获的新数据集。

# for example, after you tokenized the dataset:
tokenized_datasets = tokenized_datasets.rename_column('Sentiment', 'label')

最后,您需要指定实际要用于训练的数据集的拆分。在这里,由于您没有拆分数据集,它应该只包含一个:'train'

trainer = Trainer(
    model=model, 
    args=training_args, 
    train_dataset=tokenized_datasets['train'] # here
)

这应该使你的代码工作,但并不意味着你会得到任何有趣的结果。由于您对使用变形金刚感兴趣,我强烈建议您看一下huggingface 的系列笔记本

于 2021-12-07T16:41:14.797 回答