python - 无法使用 transforms.ToTensor 和 transforms.Normalize 标准化 MNIST 数据集

我使用以下代码规范化 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.)

相似文章

c++ - cout 语句导致感知器准确性发生变化

我在C++中实现了一个感知器,可以区分MNIST数据集中的2和6。但是,当我在测试循环中注释掉cout语句时,我发现了一些奇怪的行为。当我让测试循环打印出预测数字和实际数字时,感知器的最终准确度比我没...

最新文章