不使用数据加载器来转换每一个训练点

2024-04-25 00:50:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚发现,即使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)范围内的数据应标准化为transformer行为的(-1,1)。你知道吗

[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对象变换整个图像的最佳方法是什么,以便获得预期的变换图像,而不必逐个手动变换?你知道吗


Tags: 图像truedatasizetransformtorchtensormnist
1条回答
网友
1楼 · 发布于 2024-04-25 00:50:55

当使用数据集的__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)

相关问题 更多 >