如果我这样做
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_train
的data
属性,这个属性是在你创建MNIST实例时定义的,具体位置在这一行。如果你查看__init__
方法中之前的代码,会发现没有任何转换操作!
另一方面,当你执行
mnist_train[i]
对象的__getitem__
方法会被触发,你可以在这里找到它。这个方法中有一个针对transform
的if
语句,因此你现在得到的是转换后的版本。
由于常见的使用方式是通过torch.utils.data.DataLoader
来使用这个MNIST数据集(或其他任何数据集),而它会调用这个__getitem__
方法,所以我们得到了归一化后的值。