我使用以下代码规范化 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]
,但我不知道为什么会这样。有什么不对?
回答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
您必须通过其适当的接口访问数据集才能使转换 pipeline 生效。为了确保您可以将整个数据集的输入展开到 tensor 中并查看其范围:
>>> x, y = zip(*train_set)
>>> x_ = torch.stack(x)
>>> f'min:{x_.min()} max:{x_.max()}'
min:tensor(0.) max:tensor(1.)