4

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

图像/袜子/袜子图像.jpeg
图像/裤子/裤子图像.jpeg
图像/衬衫/衬衫图像.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 新手

4

3 回答 3

5

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

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在张量上应用转换时会出现此错误。

于 2017-08-23T20:23:15.667 回答
1

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

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

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

所以输入Scale不是。PIL.ImageTensor

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))])

您可以使用脚本在此 gist处加载您的自定义数据集。单击此处查看脚本的结果。

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

于 2017-08-18T10:41:15.167 回答
0

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

于 2017-04-18T16:28:12.967 回答