修复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
相关产品推荐
相关产品推荐

