试图在Pytorch中加载自定义数据集

时间:2017-04-16 20:13:16

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

我刚刚开始使用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的新手

3 个答案:

答案 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”文件夹的绝对路径,看看它是否有帮助。