我试图使用HuggingFace库来使用自定义数据集对T5转换器模型进行微调。HF提供了一个使用自定义数据进行微调的例子,但是这是针对蒸馏器模型的,而不是我想要使用的T5模型。从他们的示例中可以看出,我需要在dataset子类中实现len和getitem方法,但是在使用t5而不是蒸馏器时,似乎没有太多的文档说明要更改什么。下面是令牌程序代码,然后是我试图更改getitem的尝试
以及trainer.train()产生的错误,即“KeyError:‘标签’”
我已经看到了下面的讨论,它似乎与这个问题有关,但是提供的答案仍然会在trainer.train()中产生一个错误,如果有用的话,我也可以发布这个错误。
使用“使用自定义数据进行微调”的原始示例代码,dataset类是:
但是,培训师的错误改变了:
这就是最初让我四处寻找解决方案的原因。因此,使用“使用自定义数据进行微调”似乎并不像更改模型和标记器(以及您正在培训的输入/输出数据)一样简单,因为当从蒸馏器切换到文本模型(如T5 )时。蒸馏器没有任何输出文本可以训练,所以我会想(但我知道什么呢?)这与T5不同,但我无法找到关于如何使用的文档。在这个问题的底部似乎指向了要遵循的方向,但是我再次不知道(很多!)
我想我可能已经解决了这个问题(至少教练跑并完成了)。蒸馏器模型没有输出文本,它具有作为整数列表提供给dataset类的标志。T5模型有输出文本,因此您可以分配输出编码,并依赖DataCollatorForSeq2Seq()来准备T5模型所期望的数据/特性。请参阅更改(对于T5),并注释掉HF代码(对于蒸馏器)如下:
向HuggingFace提出了一个问题,他们建议,他们网站上使用自定义数据集示例进行的微调已经过时,我需要解决他们维护的示例。
发布于 2022-01-30 05:39:43
根据您的截图,我将如何实现len和getitem。
class ToxicDataset(torch.utils.data.Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
item['labels'] = torch.tensor(self.labels['input_ids'][idx])
return item
def __len__(self):
return len(self.labels['input_ids']) https://stackoverflow.com/questions/68625465
复制相似问题