我刚开始使用 PyTorch,不幸的是,在将我自己的训练/测试图像数据集用于自定义算法时,我有点困惑。对于初学者,我正在制作一个小型的“hello world”式卷积衬衫/ socks /裤子分类网络。我只加载了一些图像,只是确保 PyTorch 可以加载它们并将它们正确地转换为 32x32 可用图像。我的 ImageFolder 设置如下:
imgs/socks/sockimages.jpeg
imgs/pants/pantsimages.jpeg
imgs/shirt/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 新手
最佳答案
我认为出现错误是因为在 transform.Compose
中,您首先执行的是 .ToTensor()
,而您应该执行 .Scale()
。 Pytorch
对张量 和PIL 图像 进行转换,不可 互换。
阅读它说的文档
class torchvision.transforms.Scale(size, interpolation=2) [...] Rescale the input PIL.Image to the given size.
当您在缩放之前将该图像更改为 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
转换时会出现此错误。
关于python - 尝试在 Pytorch 中加载自定义数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43441673/