加载自定义数据集到HuggingFace Trainer时出现AttributeError错误
解决Trainer API中AttributeError: 'dict' object has no attribute 'size'的问题
错误根源
- Trainer的
train_dataset和eval_dataset参数要求传入PyTorch Dataset对象,你却传了DataLoader实例,这是核心错误。 - 额外添加的
data_collator逻辑完全错误:你的CustomDataset已经返回字典格式的单样本数据,DataLoader会自动将多个样本的字典拼接成批量字典,而你写的collator试图按索引取元素,导致后续处理时把字典当成列表操作,触发属性错误。
修正方案
- 删掉
trainLoader和testLoader的创建代码,直接用CustomDataset实例作为Trainer的数据集参数。 - 移除Trainer初始化时的
data_collator参数,Trainer会自动处理字典格式的Dataset。
修正后的完整代码
modelName='bert-base-uncased' tokenizer = BertTokenizer.from_pretrained(modelName) model = BertForSequenceClassification.from_pretrained(modelName, num_labels=6) class CustomDataset(Dataset): def __init__(self, dataframe, tokenizer): self.data = dataframe self.tokenizer=tokenizer def __len__(self): return len(self.data) def __getitem__(self, idx): text = self.data.loc[idx, "text"] # 'text' column emotions = self.data.loc[idx, "emotions"] # 'emotions' column inputs = self.tokenizer( text, padding="max_length", truncation=True, return_tensors="pt" ) return { 'input_ids': inputs["input_ids"].squeeze(), 'attention_mask': inputs["attention_mask"].squeeze(), 'labels': int(emotions), } # 直接使用Dataset实例,不需要DataLoader trainDataset=CustomDataset(trainDF, tokenizer) testDataset=CustomDataset(testDF, tokenizer) trainingArgs= TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=16, evaluation_strategy="steps", save_steps=500, eval_steps=500, ) trainer = Trainer( model=model, args=trainingArgs, train_dataset=trainDataset, # 传Dataset而非DataLoader eval_dataset=testDataset, # 传Dataset而非DataLoader # 移除错误的data_collator参数 ) trainer.train()
额外优化建议
- 你定义的
tokenizeFunction没用到,可以删掉,避免冗余。 - 注意如果你的DataFrame索引不是连续整数,
self.data.loc[idx, "text"]可能会出问题,建议提前重置索引:dataframe = dataframe.reset_index(drop=True),确保idx能正确定位行。
内容的提问来源于stack exchange,提问作者Shiyan Liu
相关产品推荐
相关产品推荐

