我正在尝试微调一个模型来执行文本摘要,我使用的是AutoModelForSeq2SeqLM.from_pretrained()
,所以下面的内容适用于几个模型(例如T5、ProphetNet、BART)。
我创建了一个名为CustomDataset
的类,它是torch.utils.Dataset
的子类,包含一个字段:samples
-一个包含encodings
和labels
键的字典列表。每个字典中的每个值都是一个torch.Tensor
。samples
中的条目如下所示:{'encoding': tensor([[21603, 10, 188, 563, 1]]), 'label': tensor([[ 1919, 22003, 22, 7, 1]])}
下面是我尝试使用Trainer微调模型的方法:
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
training_args = TrainingArguments("test_trainer")
trainer = Trainer(
model=model,
args=training_args,
train_dataset=data,
)
trainer.train()
在transformers\data\data_collator.py
的第63行中抛出了我遇到的错误。label = first["label"].item() if isinstance(first["label"], torch.Tensor) else first["label"]
下面是错误消息:x1米11米1x
我理解为什么会抛出这个错误信息--first["label"]
Tensor不是一个单元素Tensor,因此不能调用item()
,但这不是我问这个问题的原因。
我假设我没有正确地传递数据,但是在我看来Trainer
应该自己处理input_ids
和decoder_input_ids
。(将encodings
传为input_ids
,将labels
传为decoder_input_ids
),模型能够成功进行推理,但我还没能对它进行微调。我在哪里犯了错误?我该如何改正?
1条答案
按热度按时间ars1skjm1#
使用名称
label_ids
而不是label
可以解决特定问题。如果标签是int
、float
或单元素torch.Tensor
,则应使用label
。对于具有多个元素的Tensor,请使用label_ids
。有关详细信息,请参见data_collator.py
,第62-71行:此外,应使用名称
input_ids
而不是encoding
。否则,将引发unknown kwarg
错误。