PyTorch训练报错AttributeError:'list'对象无'to'属性求助
问题定位与解决:'list'对象没有'to'属性
核心原因
这个错误的本质是你试图对Python原生列表调用.to()方法,但只有PyTorch的Tensor或nn.Module类才有这个方法。训练流程中通常是DataLoader返回的数据不是Tensor类型,而是列表,导致后续执行data.to(device)时触发错误。
排查方向与解决步骤
1. 检查Dataset的__getitem__方法
Dataset的__getitem__必须返回Tensor类型的输入和标签,如果返回的是Python列表,DataLoader输出的batch会是列表的列表,而非Tensor。
- 错误示例:
def __getitem__(self, idx): img = self.data[idx] # 像素值为列表形式 label = self.labels[idx] return img, label # 返回列表和整数,不是Tensor - 修正方法:用
torch.tensor()转换为Tensor:def __getitem__(self, idx): img = torch.tensor(self.data[idx], dtype=torch.float32) label = torch.tensor(self.labels[idx], dtype=torch.long) return img, label
2. 检查预处理流程(归一化/标准化)
如果归一化/标准化代码直接对列表操作,没有转换为Tensor,会导致数据保持列表类型:
- 错误示例:
def normalize(img): return [x/255.0 for x in img] # 返回列表 - 修正方法:先转Tensor再做归一化,或用PyTorch官方transforms模块(更推荐):
from torchvision import transforms transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.5], std=[0.5]) ])
3. 验证DataLoader输出类型
在训练循环开头添加打印,确认batch数据类型:
for batch in dataloader: inputs, labels = batch print(type(inputs), type(labels)) # 正常应输出<class 'torch.Tensor'> break
如果输出是列表,说明Dataset的__getitem__未返回Tensor,回到第一步修正。
4. 检查训练循环中的.to(device)调用
确保仅对Tensor调用.to(device),避免对列表操作:
- 错误示例:
inputs, labels = data # data为列表时,inputs/labels也会是列表 inputs = inputs.to(device) # 触发错误 - 修正后:先确保
inputs和labels是Tensor,再执行设备转换。
错误栈辅助排查
如果错误栈指向model(inputs)或inputs.to(device)行,直接定位到输入数据类型问题,按上述步骤逐一排查即可。
内容的提问来源于stack exchange,提问作者Lemair
相关产品推荐
相关产品推荐

