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

修复HuggingFace PyTorch版Trainer报vars()参数无__dict__属性错误

报错根因

该报错触发逻辑是Transformers库Trainer模块内置的默认数据整理器(data collator)在组装批次数据时,会调用vars()尝试把单个样本转换为字典结构:

  • 若自定义Dataset返回的是普通元组(例如直接返回(image_tensor, label)格式的二元组)、基础数据类型等没有__dict__属性的对象,vars()调用就会直接抛出该TypeError。
  • 该问题和Resize、CenterCrop、ToTensor等torchvision预处理变换本身无关,这些官方变换输出的标准Tensor不会触发属性错误。
可行修复方案
  • 方案1:修改自定义Dataset的返回格式
    调整MyDataset类的__getitem__方法,将原本返回元组的逻辑改为返回固定key的字典,匹配Trainer默认的字段预期,参考实现:
    import torch
    from torch.utils.data import Dataset
    from PIL import Image
    
    class MyDataset(Dataset):
        def __init__(self, split_subset, transform=None):
            self.data = split_subset
            self.transform = transform
    
        def __getitem__(self, index):
            # 适配ImageFolder经random_split拆分后的样本读取逻辑
            raw_img, label = self.data[index]
            if self.transform is not None:
                processed_img = self.transform(raw_img)
            # 核心修改:返回字典而非元组
            return {
                "pixel_values": processed_img,
                "labels": label
            }
    
        def __len__(self):
            return len(self.data)
    
  • 方案2:显式传入自定义数据整理函数
    如果不想修改原有Dataset的返回结构,可以在初始化Trainer时传入自定义的data_collator,手动完成批次组装,跳过默认collator里的vars()调用逻辑,参考实现:
    import torch
    from transformers import Trainer
    
    def collate_fn(batch_samples):
        # 适配Dataset返回(image, label)元组的场景
        batch_imgs = torch.stack([sample[0] for sample in batch_samples])
        batch_labels = torch.tensor([sample[1] for sample in batch_samples])
        return {
            "pixel_values": batch_imgs,
            "labels": batch_labels
        }
    
    trainer = Trainer(
        model=your_pretrained_model,
        args=your_training_args,
        train_dataset=train_set,
        eval_dataset=val_set,
        compute_metrics=your_compute_metrics_func,
        data_collator=collate_fn # 传入自定义整理函数
    )
    
  • 方案3:排查自定义扩展逻辑
    如果你在预处理流水线中加入了自行实现的变换函数,检查其输出是否为标准PyTorch Tensor/字典类型,避免输出无__dict__属性的特殊封装对象。
校验方式

修改完成后可以先执行print(type(train_dataset[0]))做快速验证:如果输出是dict类型,或者配合自定义collator可以正常组装出包含pixel_values和labels字段的批次字典,再调用trainer.train()就不会触发该报错。

内容的提问来源于stack exchange,提问作者shantanu rahut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:36:23