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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:32:40