首页 > 解决方案 > 标准化和缩放 MNIST 数据集的正确方法

问题描述

我到处找,但找不到我想要的。基本上,MNIST 数据集具有像素值在范围内的图像[0, 255]。人们说,一般来说,最好做到以下几点:

不幸的是,没有人展示过如何做这两件事。它们都减去 的平均值0.1307并除以 的标准差0.3081。这些值基本上是数据集的平均值和标准差除以 255:

from torchvision.datasets import MNIST        
import torchvision.transforms as transforms 

trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True)
print('Min Pixel Value: {} \nMax Pixel Value: {}'.format(trainset.data.min(), trainset.data.max()))
print('Mean Pixel Value {} \nPixel Values Std: {}'.format(trainset.data.float().mean(), trainset.data.float().std()))
print('Scaled Mean Pixel Value {} \nScaled Pixel Values Std: {}'.format(trainset.data.float().mean() / 255, trainset.data.float().std() / 255))

这将输出以下内容

Min Pixel Value: 0 
Max Pixel Value: 255
Mean Pixel Value 33.31002426147461 
Pixel Values Std: 78.56748962402344
Scaled Mean: 0.13062754273414612 
Scaled Std: 0.30810779333114624

但是很明显,以上都没有!结果数据 1) 不会介于两者之间[0, 1],也不会具有 mean0或 std 1。事实上,这就是我们正在做的事情:

[data - (mean / 255)] / (std / 255)

这与此非常不同

[(scaled_data) - (mean/255)] / (std/255)

scaled_data只是在哪里data / 255

标签: pythonmachine-learningpytorchmnist

解决方案


我认为您误解了一个关键概念:这是两种不同且不一致的扩展操作。您只能拥有以下两者之一:

  • 平均值 = 0,标准差 = 1
  • 数据范围 [0,1]

考虑一下,考虑 [0,1] 范围:如果数据都是小的正值,min=0 和 max=1,那么数据的总和必须是正的,给出一个正的非零均值。同样,当没有数据可能与平均值相差 1.0 之多时,stdev也不能是。1

相反,如果您的均值 = 0,则某些数据必须为负数。


您只使用两种转换中的一种。您使用哪一种取决于您的数据集的特征,以及——最终——哪一种适合你的模型。

对于 [0,1] 缩放,您只需除以 255。

对于 mean=0, stdev=1 缩放,您执行您已经知道的简单线性变换:

new_val = (old_val - old_mean) / old_stdev

这是否为您澄清了这一点,还是我完全错过了您的困惑?


推荐阅读