未能使用 transforms.ToTensor 和 transforms.Normalize 规范化 MNIST 数据集

Failed to use transforms.ToTensor and transforms.Normalize to normalize the MNIST dataset

我使用以下代码对 MNIST 数据集进行规范化,当我打印第一个样本时,它无法规范化,因为最大元素是 255,而不是 1

train_transform = transforms.Compose([
   transforms.ToTensor(), 
   transforms.Normalize((0.1307,), (0.3081,))])

train_set = torchvision.datasets.MNIST(
   root=data_dir, train=True, download=True, transform=train_transform)

当我检查数据集输入图像的范围时:

print("min:%f max:%f" %(train_set.data.min(), train_set.data.max()))
output result:min:0.000000 max:255.000000

我原本期待 [0, 1],但我不知道为什么会这样。有什么问题吗?

你的范围为 [0,255] 的原因是你正在通过 data 属性访问数据集的基础数据。这意味着转换尚未应用于数据。

>>> train_transform = T.Compose([T.ToTensor()])
>>> train_set = torchvision.datasets.MNIST(
       root='.', train=True, download=True, transform=train_transform)

您访问的数据:

>>> f'min:{train_set.data.min()} max:{train_set.data.max()}'
min:0.000000 max:255.000000

您必须通过适当的接口访问数据集才能使转换管道生效。为确保您可以将整个数据集的输入展开为张量并查看其范围:

>>> x, y = zip(*train_set)
>>> x_ = torch.stack(x)
>>> f'min:{x_.min()} max:{x_.max()}'
min:tensor(0.) max:tensor(1.)