pytorch HuggingFace文本摘要输入数据格式问题

csga3l58  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在尝试微调一个模型来执行文本摘要,我使用的是AutoModelForSeq2SeqLM.from_pretrained(),所以下面的内容适用于几个模型(例如T5、ProphetNet、BART)。
我创建了一个名为CustomDataset的类,它是torch.utils.Dataset的子类,包含一个字段:samples-一个包含encodingslabels键的字典列表。每个字典中的每个值都是一个torch.Tensorsamples中的条目如下所示:
{'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_idsdecoder_input_ids。(将encodings传为input_ids,将labels传为decoder_input_ids),模型能够成功进行推理,但我还没能对它进行微调。我在哪里犯了错误?我该如何改正?

ars1skjm

ars1skjm1#

使用名称label_ids而不是label可以解决特定问题。如果标签是intfloat或单元素torch.Tensor,则应使用label。对于具有多个元素的Tensor,请使用label_ids。有关详细信息,请参见data_collator.py,第62-71行:

if "label" in first and first["label"] is not None:
    label = first["label"].item() if isinstance(first["label"], torch.Tensor) else first["label"]
    dtype = torch.long if isinstance(label, int) else torch.float
    batch["labels"] = torch.tensor([f["label"] for f in features], dtype=dtype)
elif "label_ids" in first and first["label_ids"] is not None:
    if isinstance(first["label_ids"], torch.Tensor):
        batch["labels"] = torch.stack([f["label_ids"] for f in features])
    else:
        dtype = torch.long if type(first["label_ids"][0]) is int else torch.float
        batch["labels"] = torch.tensor([f["label_ids"] for f in features], dtype=dtype)

此外,应使用名称input_ids而不是encoding。否则,将引发unknown kwarg错误。

相关问题