You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载自定义数据集到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试图按索引取元素,导致后续处理时把字典当成列表操作,触发属性错误。

修正方案

  1. 删掉trainLoader和testLoader的创建代码,直接用CustomDataset实例作为Trainer的数据集参数。
  2. 移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:12:18