Pytorch MNIST数据集标准化为什么是transforms.Normalize((0.1307,), (0.3081,))

Pytorch已经提供了MNIST数据集,只要调用datasets.MNIST()下载即可,这里要注意的是标准化(Normalization):

transforms.Normalize((0.1307,), (0.3081,))

标准化(Normalization)

和基于决策树的机器学习模型,如RF、xgboost等不同的是,神经网络特别钟爱经过标准化处理后的数据。标准化处理指的是,data减去它的均值,再除以它的标准差,最终data将呈现均值为0方差为1的数据分布。决策树模型在哪里split特征是由特征序列决定的,跟具体数值无关,所以并不要求数据做标准化处理,至于详细原因以后有机会写机器学习博文时再详述。

神经网络模型偏爱标准化数据,原因是均值为0方差为1的数据在sigmoid、tanh经过激活函数后求导得到的导数很大,反之原始数据不仅分布不均(噪声大)而且数值通常都很大(本例中数值范围是0~255),激活函数后求导得到的导数则接近与0,这也被称为梯度消失。前文已经分析,神经网络是根据函数对权值求导的导数来调整权值,导数越大,调整幅度越大,越快逼近目标函数,反之,导数越小,调整幅度越小,所以说,数据的标准化有利于加快神经网络的训练。

除此之外,还需要保持train_set、val_set和test_set标准化系数的一致性。标准化系数就是计算要用到的均值和标准差,在本例中是((0.1307,), (0.3081,)),均值是0.1307,标准差是0.3081,这些系数都是数据集提供方计算好的数据

不同数据集就有不同的标准化系数,例如([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])就是Imagenet dataset的标准化系数(RGB三个通道对应三组系数),当需要将imagenet预训练的参数迁移到另一神经网络时,被迁移的神经网络就需要使用imagenet的系数,否则预训练不仅无法起到应有的作用甚至还会帮倒忙,

例如,我们想要用神经网络来识别夜空中的星星,因为黑色是夜空的主旋律,从像素上看黑色就是数据集的均值,标准化操作时,所有图像会减去均值(黑色),如此Imagenet预训练的神经网络很难识别出这些数据是夜空图像。

猜你喜欢

转载自blog.csdn.net/Harpoon_fly/article/details/84987589