python - 标准化和缩放 MNIST 数据集的正确方法
问题描述
我到处找,但找不到我想要的。基本上,MNIST 数据集具有像素值在范围内的图像[0, 255]
。人们说,一般来说,最好做到以下几点:
- 将数据缩放到
[0,1]
范围。 - 将数据归一化以具有零均值和单位标准差
(data - mean) / std
。
不幸的是,没有人展示过如何做这两件事。它们都减去 的平均值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
。
解决方案
我认为您误解了一个关键概念:这是两种不同且不一致的扩展操作。您只能拥有以下两者之一:
- 平均值 = 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
这是否为您澄清了这一点,还是我完全错过了您的困惑?
推荐阅读
- flutter - 无法识别特定状态下的内部方法,BloC 模式
- android - 无法绑定服务(尝试总是返回 false)。为什么?
- python - Chaquopy 不适用于 Android Studio 模拟器
- java - 使用蒙特卡罗方法的 pi 值输出错误
- animation - Flutter AnimatedList 仍然卡顿?
- spring-boot - Spring Boot 层架构
- python-3.x - 如何在python中进行动态列表更改?
- git - GIT 使用文件修改数据而不是文件内容
- php - 已解决:无法在 nginx 上写入会话数据 codeigniter
- angular - 错误类型错误:使用 mat-stepper 时无法读取未定义的属性“已选择”