自定义PyTorch Dataset用于BERT微调时触发TypeError如何解决
报错核心原因
你自定义Dataset子类时,Python类的特殊方法(魔法方法)命名错误:所有需要被父类识别的特殊方法,名称前后必须是双下划线,你写的是单下划线,导致Python没有识别到你定义的构造方法,传入的inputs参数无法被接收,最终触发实例化报错。
可直接运行的修复后代码
import torch from torch.utils.data import Dataset class MeditationsDataset(Dataset): def __init__(self, encodings): self.encodings = encodings def __getitem__(self, idx): # 编码结果本身已是Tensor类型,无需重复转换 return {key: val[idx] for key, val in self.encodings.items()} def __len__(self): # 字典类型用键索引取值,不要用属性访问 return len(self.encodings["input_ids"]) dataset = MeditationsDataset(inputs)
具体修改点
- 修正所有特殊方法的命名:将单下划线包裹的
_init_/_getitem_/_len_改为双下划线包裹的__init__/__getitem__/__len__,这是解决TypeError的核心修改。 - 移除
__getitem__中多余的torch.tensor()包装:你提供的编码后数据本身就是PyTorch张量,重复转换会触发张量拷贝警告,直接索引取值即可。 - 修正
__len__中的取值逻辑:你的编码结果是普通Python字典,不存在.input_ids属性,改用键访问self.encodings["input_ids"]即可避免后续运行时的属性报错。
内容的提问来源于stack exchange,提问作者Moty.R
相关产品推荐
相关产品推荐

