Python 在不使用数据加载程序的情况下转换每个训练点

Python 在不使用数据加载程序的情况下转换每个训练点,python,pytorch,Python,Pytorch,我刚刚发现,即使torchvision.dataset.MNIST接受transformer参数 transform=transforms.compose( [transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,)] ) mnist_trainset=datasets.mnist( root=“mnist”,train=True,download=True,transform=transform ) …从mnist\u列车组.data变

我刚刚发现,即使
torchvision.dataset.MNIST
接受
transformer
参数

transform=transforms.compose(
[transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,)]
)
mnist_trainset=datasets.mnist(
root=“mnist”,train=True,download=True,transform=transform
)
…从
mnist\u列车组.data
变量获得的值仍未转换(请注意,关于
变压器的行为,应将(0,255)范围内的数据标准化为(-1,1))

[102]mnist\u testset.data[0].min()
张量(0,dtype=torch.uint8)
[103]mnist_testset.data[0].max()
张量(255,dtype=torch.uint8)
我尝试在
mnist\u trainset.data
上调用
mnist\u trainset.transform
,但输出形状不是我想要的

[104] mnist_testset.data.shape
torch.Size([10000, 28, 28])

[105] transform(mnist_testset.data).shape
torch.Size([3, 28, 28])

# Should be [10000, 28, 28] as identical to the original data.

我可以使用
DataLoader
加载整个训练集,并将洗牌设置为
False
,但我认为这太过分了。使用已定义的
transformer
对象转换整个
mnist\u测试集
的最佳方法是什么,以获得预期的转换图像,而不必逐个手动进行转换?

当您使用其
\uu getitem\uuu
方法对数据集进行采样时,将调用转换。因此,您可以执行以下操作来获取所有转换的数据

imgs_transformed = []
for img, label in mnist_testset:
    imgs_transformed.append(img[0,:,:])
或者使用列表理解

imgs_transformed = [img[0,:,:] for img, label in mnist_testset]

如果你想把它变成一个大张量,你可以使用
torch.stack

data_transformed = torch.stack(imgs_transformed, dim=0)

如果您正在传递
MNIST
data
字段,则在
transform
中不需要
ToTensor()。你能试着把它从
transform
中删除,然后像这样在第一个维度中传递
tensor
未经查询:
transform(mnist_testset.data.unsqueze(dim=1))
?谢谢!是的,
ToTensor()
在我的代码中,大写,当我粘贴到这里时,我不小心将所有文本的大写字母都降低了。删除
转换
并将代码结果运行到
类型错误:tensor不是火炬图像。
。MNIST数据集在
MNIST中应用转换之前,将每个样本转换为
PIL.image
。\uu getitem\uuuuuuu
因此,如果使用
MNIST\u测试集对数据集进行采样,则必须使用
ToTensor
[idx]
或者如果您使用数据加载器。关于这个答案,我希望会有一些“Pythonista”,一个线性代码来完成这项工作。不幸的是,似乎有一个。另一个选项是使用
DataLoader
,其大小设置为数据集的长度,并且没有如前所述的混乱。无论如何,感谢您的友好回答!是的,最明显的方法是使用DataLoader,我从最初的问题中了解到,您想要一个解决方案它不依赖于数据加载器。