我刚刚开始使用PyTorch,不幸的是,在使用我自己的训练/测试图像数据集进行自定义算法时,我有点困惑。首先,我正在制作一个小型的#hello world" -esque卷积衬衫/袜子/裤子分类网络。我只加载了一些图像,我只是确保PyTorch可以加载它们并将它们正确地转换为32x32可用图像。我的ImageFolder设置如下:
IMGS /袜子/ sockimages .JPEG
IMGS /裤/ pantsimages .JPEG
IMGS /衬衫/ shirtimages .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的新手
答案 0 :(得分:4)
我认为错误的发生是因为transform.Compose
你先做.ToTensor()
,而你应该做.Scale()
。
阅读它所说的文档
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))])
PS:我很晚才回答这个问题,但希望它可以帮助新人。
答案 1 :(得分:1)
对于您的问题,我认为在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
进行检查答案 2 :(得分:0)
这可能就像您没有提供“imgs”文件夹的正确路径一样简单。您是否在与“imgs”文件夹相同的文件夹中运行程序?尝试指定“imgs”文件夹的绝对路径,看看它是否有帮助。