PyTorch ToTensor 缩放到 [0,1] 差异

PyTorch ToTensor scaling to [0,1] discrepancy

如果我这样做

mnist_train = MNIST('../data/MNIST', download = True,
                transform = transforms.Compose([
                    transforms.ToTensor(),
                ]), train = True)

mnist_train.data.max()

为什么我得到 255?我应该得到 1,因为 ToTensor() 缩放到 [0,1],对吗?

如果我这样做:

for i in range(0, len(mnist_train)):
    print(mnist_train[i][0].max())

然后,我得到差不多1?

有人能帮我理解一下吗?

当你做的时候

mnist_train.data

PyTorch 为您提供 mnist_traindata 属性,该属性在 this line 上定义(当您创建 MNIST 实例时)。如果您在 __init__ 中查看它之前的代码,则不会发生转换!

OTOH,当你这样做时

mnist_train[i]

对象的__getitem__方法被触发,你可以找到here。此方法中有 transformif 语句,因此您现在得到转换后的版本。

由于常见的用法是通过 torch.utils.data.DataLoader 使用这个 MNIST 数据集(或任何其他数据集),它称之为 __getitem__,我们得到了标准化值。