欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习中的数据预处理之中心化(零均值化)与标准化(归一化)

程序员文章站 2022-07-16 18:45:59
...

在机器学习回归问题,以及训练神经网络过程中,通常需要对原始数据进行中心化(零均值化)与标准化(归一化)预处理。

目的:通过中心化和标准化处理,最终得到均值为0,标准差为1的服从标准正态分布的数据。

原理:

      中心化(又叫零均值化):是指变量减去它的均值。其实就是一个平移的过程,平移后所有数据的中心是(0,0)。

      标准化(又叫归一化): 是指数值减去均值,再除以标准差。

零均值化:

为什么要零均值化?

  1. 人们对图像信息的摄取通常不是来自于像素色值的高低,而是来自于像素之间的相对色差。零均值化并没有消除像素之间的相对差异(交流信息),仅仅是去掉了直流信息的影响。(很多情况下我们对图像的照度并不感兴趣,而更多地关注其内容,虽然图像被零均值化后变成了一团黑,但是可能计算机好理解了)
  2. 数据有过大的均值也可能导致参数的梯度过大。
  3. 如果有后续的处理,可能要求数据零均值,比如PCA。

假设数据存放在一个矩阵 X 中,X 的形状为(N,D),N 是样本个数,D 是样本维度,零均值化操作可用 python 的 numpy 来实现:

X -= numpy.mean(X, axis=0)

即 X 的每一列都减去该列的均值。

对于灰度图像,也可以减去整张图片的均值:

X -= numpy.mean(X)

对于彩色图像,将以上操作在3个颜色通道内分别进行即可。


归一化(Normalization)

为什么要归一化?

归一化是为了让不同维度的数据具有相同的分布规模。

假如二维数据数据(x1,x2)两个维度都服从均值为零的正态分布,但是x1方差为100,x2方差为1。可以想像对(x1,x2)进行随机采样并在而为坐标系中标记后的图像,应该是一个非常狭长的椭圆形。

对这些数据做特征提取会用到以下形式的表达式:

S = w1*x1 + w2*x2 + b

则:

dS / dw1 = x1     ,      dS / dw2 = x2

由于x1与x2在分布规模上的巨大差异,w1与w2的导数也会差异巨大。此时绘制目标函数(不是S)的曲面图,就像一个深邃的峡谷,沿着峡谷方向变化的是w2,坡度很小;在峡谷垂直方向变化的是w1,坡度非常陡峭。

因为我们期望的目标函数是这样的:

                  深度学习中的数据预处理之中心化(零均值化)与标准化(归一化)

而现在的目标函数可能是这样的:

                                                      深度学习中的数据预处理之中心化(零均值化)与标准化(归一化)

这样的目标函数是非常难以优化的。因为w1与w2的梯度差异太大,在两个维度上需要不同的迭代方案。但是在实际操作中,为了简便,我们通常为所有维度设置相同的步长,随着迭代的进行,步长的缩减在不同维度间也是同步的。这就要求W不同维度的分布规模大致相同,而这一切都始于数据的归一化。

一个典型的归一化实现:

X /= numpy.std(X, axis = 0)

在自然图像上进行训练时,可以不进行归一化操作,因为(理论上)图像任一部分的统计性质都应该和其它部分相同,图像的这种特性被称作平稳性(stationarity)。(注意是同分布,不是独立同分布)


下图中以二维数据为例:左图表示的是原始数据;中间的是中心化后的数据,数据被移动大原点周围;右图将中心化后的数据除以标准差,得到为标准化的数据,可以看出每个维度上的尺度是一致的(红色线段的长度表示尺度)。

              深度学习中的数据预处理之中心化(零均值化)与标准化(归一化)

引用:

https://blog.csdn.net/f110300641/article/details/85099520

https://my.oschina.net/findbill/blog/661817