Python 正在尝试在Pytorch中加载自定义数据集

Python 正在尝试在Pytorch中加载自定义数据集,python,machine-learning,computer-vision,dataset,pytorch,Python,Machine Learning,Computer Vision,Dataset,Pytorch,我刚开始使用PyTorch,不幸的是,在使用我自己的训练/测试图像数据集进行自定义算法时,我有点困惑。首先,我正在制作一个小型的“hello world”样式的卷积衬衫/袜子/裤子分类网络。我只加载了一些图像,我只是想确保PyTorch可以加载它们,并将它们正确地转换为32x32可用图像。我的ImageFolder设置如下: imgs/socks/sockimages.jpeg imgs/pants/pantsimages.jpeg imgs/shirt/shirtimages.jpeg 我的测

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

imgs/socks/sockimages.jpeg
imgs/pants/pantsimages.jpeg
imgs/shirt/shirtimages.jpeg

我的测试图像文件夹也有类似的设置。据我目前所知,PyTorch内置的图像加载器应该从培训/测试图像中的子文件夹名称中读取标签。然而,我得到了一个
类型错误
抱怨我的迭代器不可测试。以下是我的代码和错误:

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)))
错误: 它表示它引用了包含
dataiter.next()
的行,这意味着编译器认为我无法迭代
dataiter

请帮忙!提前感谢,


-David Sillman,PyTorch新手这可能很简单,因为您没有提供到“imgs”文件夹的正确路径。您是否从与“imgs”文件夹相同的文件夹运行程序?尝试指定“imgs”文件夹的绝对路径,看看是否有帮助。

对于您的问题,我认为
transforms.ToTensor()
之前的
transform.Scale((32,32))
不正确

比例的文档中::\u调用(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))])
您可以使用脚本加载自定义数据集。单击以查看脚本的结果


我在自定义图像中发布了完整的分类,您可以在github.com/xpzouying/animals classification上查看它。我认为错误是因为在
转换中。Compose
您首先要做
.ToTensor()
,而应该做
.Scale()
Pytorch
张量和PIL图像上具有不可互换的变换。 阅读上面的文件

类torchvision.transforms.Scale(大小,插值=2)[…] 将输入的图片重新缩放到给定的大小

当您在缩放之前将该图像更改为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
变换时会出现此错误。

这不起作用。如果是这样的话,它会说没有这样的文件或目录。嗯,如果你改为尝试
images,labels=next(iter(trainloader))
,你会得到同样的错误吗?不幸的是,我仍然会得到同样的uniterable内置方法/函数错误。我不知道是什么导致了这种现象。这是否发生在你身上?我还没有尝试运行你的代码,但不久前在我的案例中看到了类似的情况。问题似乎是您传递的火车装载机与您期望的不同(在我的案例中,当我传递数据集本身而不是火车装载机时,出现了类似的问题)。您是否已尝试打印trainloader对象的内部,以查看它是否包含预期的数据?将来,将支持
transform.Resize()
class。
transform = transforms.Compose(
                   [transforms.Scale((32,32)),
                    transforms.ToTensor(),
                    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])