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

PyTorch DataLoader遍历图像文件夹报错:AttributeError求助

问题:加载ants_and_bees数据集遍历DataLoader时出现AttributeError

尝试加载ants_and_bees数据集,在Google Colab上遍历DataLoader时触发AttributeError,但本地Python 3.9.13环境可正常运行,推测是Colab环境或Python版本导致的问题。

使用的代码

training_dataset = datasets.ImageFolder('ants_and_bees/train', transform=transform_train)
validation_dataset = datasets.ImageFolder('ants_and_bees/val', transform=transform)

training_loader = torch.utils.data.DataLoader(training_dataset, batch_size=20, shuffle=True)
validation_loader = torch.utils.data.DataLoader(validation_dataset, batch_size = 20, shuffle=False)

def im_convert(tensor):
  image = tensor.cpu().clone().detach().numpy()
  image = image.transpose(1, 2, 0)
  image = image * np.array((0.5, 0.5, 0.5)) + np.array((0.5, 0.5, 0.5))
  image = image.clip(0, 1)
  return image

classes = ('ant', 'bee')

dataiter = iter(training_loader)
images, labels = next(dataiter)
fig = plt.figure(figsize=(25, 4))

for idx in np.arange(20):
  ax = fig.add_subplot(2, 10, idx+1, xticks=[], yticks=[])
  plt.imshow(im_convert(images[idx]))
  ax.set_title(classes[labels[idx].item()])

错误信息

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-58-fb882084a0d1> in <module>
      1 dataiter = iter(training_loader)
----> 2 images, labels = next(dataiter)
      3 fig = plt.figure(figsize=(25, 4))
      4 
      5 for idx in np.arange(20):

10 frames
/usr/local/lib/python3.8/dist-packages/PIL/TgaImagePlugin.py in _open(self)
     64         flags = i8(s[17])
     65 
---> 66         self.size = i16(s[12:]), i16(s[14:])
     67 
     68         # validate header fields

AttributeError: can't set attribute

解决办法

原因分析

这个错误源于Colab中PIL(Pillow)库的版本问题:新版Pillow中Image类的size属性改为了只读,而旧版允许直接赋值。数据集里存在TGA格式的图片,Colab使用的高版本Pillow在处理TGA图片时,TgaImagePlugin.py里的代码尝试直接设置self.size,触发了只读属性的赋值错误。

方案1:降级Pillow版本

在Colab中执行以下命令安装兼容版本,之后重启运行时再重新执行代码:

!pip install pillow==9.5.0

方案2:过滤TGA格式图片

自定义ImageFolder子类,跳过数据集里的TGA文件,避免触发该错误:

from torchvision.datasets import ImageFolder

class FilteredImageFolder(ImageFolder):
    def is_valid_file(self, path):
        # 跳过所有.tga后缀的文件
        return not path.lower().endswith('.tga')

# 使用自定义类加载数据集
training_dataset = FilteredImageFolder('ants_and_bees/train', transform=transform_train)
validation_dataset = FilteredImageFolder('ants_and_bees/val', transform=transform)

方案3:修改Pillow的TgaImagePlugin代码(临时方案)

在Colab中找到/usr/local/lib/python3.8/dist-packages/PIL/TgaImagePlugin.py文件,将第66行的self.size = i16(s[12:]), i16(s[14:])修改为self._size = i16(s[12:]), i16(s[14:]),保存后重启运行时。此方法需手动修改库文件,不如前两个方案便捷。

内容的提问来源于stack exchange,提问作者Thadeu Melo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:30:53