【问题标题】:Trying to load a custom dataset in Pytorch尝试在 Pytorch 中加载自定义数据集
【发布时间】:2017-09-12 11:49:00
【问题描述】:

我刚开始使用 PyTorch,不幸的是,在将我自己的训练/测试图像数据集用于自定义算法时,我有点困惑。首先,我正在制作一个小型的“hello world”式卷积衬衫/袜子/裤子分类网络。我只加载了一些图像,只是确保 PyTorch 可以加载它们并将它们正确转换为 32x32 可用图像。我的 ImageFolder 设置如下:

imgs/socks/sockimages.jpeg
imgs/pants/pantsimages.jpeg
imgs/shirt/衬衫图片.jpeg

以及我的测试图像文件夹的类似设置。根据我目前的知识,PyTorch 中内置的图像加载器应该从训练/测试图像中的子文件夹名称中读取标签。但是,我收到TypeError 抱怨我的迭代器不可迭代。这是我的代码和错误:

import torch
import torchvision
import torchvision.datasets as dset
import torchvision.transforms as transforms

transform = transforms.Compose(
[transforms.ToTensor(),
 transforms.Scale((32,32)),
 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = dset.ImageFolder(root="imgs",transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,shuffle=True,         num_workers=2)

testset = dset.ImageFolder(root='tests',transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,shuffle=True,     num_workers=2)

classes=('shirt','pants','sock')

import matplotlib.pyplot as plt
import numpy as np

# functions to show an image
def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))

# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()

# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

错误:

TypeError: 'builtin_function_or_method' object is not iterable

它说它引用了包含dataiter.next() 的行,这意味着编译器认为我不能迭代dataiter

请帮忙!提前致谢,

-David Sillman,PyTorch 新手

【问题讨论】:

    标签: python machine-learning computer-vision dataset pytorch


    【解决方案1】:

    我认为错误的出现是因为在transform.Compose 中,您首先执行的是.ToTensor(),相反,您应该执行.Scale()Pytorch张量PIL 图像 上有转换,它们不可 互换。 阅读它说的文档

    class torchvision.transforms.Scale(size, interpolation=2) [...] 将输入 PIL.Image 重新缩放为给定大小。

    当您在缩放之前将该图像更改为 Pytorch 张量从而使其崩溃时。

    应该改为:

    transform = transforms.Compose(
                       [transforms.Scale((32,32)),
                        transforms.ToTensor(),
                        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
    

    在张量上应用PIL Image 转换时会出现此错误。

    【讨论】:

      【解决方案2】:

      对于你的问题,我认为transforms.ToTensor()transform.Scale((32, 32)) 之前是不对的。

      Scale::__call__(self, img)的文档中已经显示

      Args: img(PIL.Image): 要缩放的图像。

      所以Scale 的输入是PIL.Image 而不是Tensor

      transform = transforms.Compose(
      [transforms.ToTensor(),
       transforms.Scale((32,32)),
       transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
      

      所以你可以试试下面的:

      transform = transforms.Compose([transforms.Scale((32,32)),
                                      transforms.ToTensor(),
                                      transforms.Normalize((0.5, 0.5, 0.5), 
                                                           (0.5, 0.5, 0.5))])
      

      您可以通过脚本在this gist 加载您的自定义数据集。点击here到脚本的结果。

      我在自定义图像中发布了完整的分类,您可以在 github.com/xpzouying/animals-classification 上查看它

      【讨论】:

      【解决方案3】:

      这可能就像您没有提供“imgs”文件夹的正确路径一样简单。您是否从与“imgs”文件夹相同的文件夹运行程序?尝试指定“imgs”文件夹的绝对路径,看看是否有帮助。

      【讨论】:

      • 这不起作用。如果是这样的话,它会说没有这样的文件或目录。
      • 嗯,如果你尝试images, labels = next(iter(trainloader)),你会得到同样的错误
      • 不幸的是,我仍然遇到相同的可统一内置方法/函数错误。我不知道是什么导致了这种现象。它发生在你身上吗?
      • 我没有尝试运行您的代码,但不久前在我的案例中看到了类似的东西。问题似乎是您传入的 trainloader 不是您所期望的(在我的情况下,当我传入数据集本身而不是 trainloader 时出现了类似的问题)。您是否尝试过打印 trainloader 对象的内部结构以查看它是否包含预期的数据?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2021-11-09
      • 2021-07-21
      • 1970-01-01
      • 2019-11-08
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多