python - 在不使用数据加载器的情况下转换每个训练点

标签 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_trainset.data变量中获取的值仍然没有转换(请注意,(0, 255)范围内的数据应该归一化为(-1, 1 ) 关于 transformer 的行为)。

[102] mnist_testset.data[0].min()
tensor(0, dtype=torch.uint8)

[103] mnist_testset.data[0].max()
tensor(255, dtype=torch.uint8)

我尝试通过 mnist_trainset.data 调用 mnist_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_testset 的最佳方法是什么,以获得预期的转换图像,而无需手动一个一个的改造?

最佳答案

当您使用 __getitem__ 方法对数据集进行采样时,将调用转换。因此,您可以执行类似以下的操作来获取所有转换后的数据。

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)

关于python - 在不使用数据加载器的情况下转换每个训练点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59017002/

相关文章:

python - 运行时错误 : Error(s) in loading state_dict for Generator: size mismatch for weights and biases using Pytorch

python - 如何在 Gephi 的 gexf 中有效地缩放节点大小

python - 有没有一个Python模块可以在不网格化的情况下对数据进行轮廓绘制

python - 如何使用 Python 请求发送 AWS 凭证?

python - basemap 数据文件的文件格式

python - 二维数组的按行 numpy.isin

Linux 上的 Python 模块 win32com

python - 通过模型微调获得异常

pytorch - 如何将张量转换为 Pytorch 中的复杂类型?

python - __getitem__ 返回值的类型注解是什么?