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