深度学习——数据预处理篇

深度学习——数据预处理篇

文章目录

  • 深度学习——数据预处理篇
      • 一、前言
      • 二、常用的数据预处理方法
          • 零均值化(中心化)
          • 数据归一化(normalization)
          • 主成分分析(PCA、Principal Component Analysis)
          • 白化(whitening)
      • 三、注意事项
      • 四、References

一、前言

深度学习和机器学习一个重要的区别就是在于数据量的大小。就目前的大量实验
和工作证明,数据量的大小能够直接影响深度学习的性能,我们都希望能够利用
小的数据集,简单的算法就能够取得不错的效果,但目前的事实是小数据集上使
用深度学习,往往效果没那么理想,所以老师也常常说,深度学习的三驾马车:
网络、损失、数据,由此可见数据对深度学习的重要性。

数据预处理在众多深度学习算法中都起着重要作用。首先数据的采集就非常的费时费力,因为这些数据需要考虑各种因素,然后有时还需对数据进行繁琐的标注。当这些都有了后,就相当于我们有了原始的raw数据,然后就可以进行下面的数据预处理部分了。

二、常用的数据预处理方法

在这之前我们假设数据表示成矩阵为X,其中我们假定X是N×D维矩阵,N是样本数据量,D为单张图片的数据向量长度。假设要处理的图像是5×5的彩色图像,那么D即5×5×3=75(因为彩色图像有RGB三个通道),假设N=1000,那么X就是1000×75的矩阵,即1000行图像的信息,每一行代表一个图像的信息。

  1. 零均值化(中心化)

    在深度学习中,一般我们会把喂给网络模型的训练图片进行预处理,使用最多的方法就是零均值化(zero-mean) / 中心化,简单说来,它做的事情就是,对待训练的每一张图片的特征,都减去全部训练集图片的特征均值,这么做的直观意义就是,我们把输入数据各个维度的数据都中心化到0了。几何上的展现是可以将数据的中心移到坐标原点。如下图中zero-centered data(当然,其实这里也有不同的做法:我们可以直接求出所有像素的均值,然后每个像素点都减掉这个相同的值;稍微优化一下,我们可以在RGB三个颜色通道分别做这件事)

    零均值化的代码为:

    X -= np.mean(X, axis = 0)# axis=0,计算每一列的均值,压缩行
    
    # 举个例子,假设训练图片有5000张,图片大小为32*32,通道数为3,则用python表示如下:
    x_train = load_data(img_dir)  # 读取图片数据 x_train的shape为(5000,32,32,3)
    x_train = np.reshape(x_train, (x_train.shape[0], -1))  # 将图片从二维展开为一维,x_train 变为(5000,3072)
    mean_image = np.mean(x_train, axis=0)  # 求出所有图片每个像素位置上的平均值 mean_image为(1, 3072)
    x_train -= mean_image  # 减去均值图像,实现零均值化
    
    # 即让所有训练图片中每个位置的像素均值为0,使得像素值范围变为[-128,127],以0为中心。
    

    深度学习——数据预处理篇_第1张图片
    例如在吴恩达的作业中就有说到,机器学习中一个常见的预处理步骤是对数据集进行集中和标准化,这意味着从每个示例中减去整个numpy数组的平均值,然后将每个示例除以整个numpy数组的标准差。但是对于图片数据集来说,将数据集的每一行除以255(像素通道的最大值)会更简单、更方便,而且几乎同样有效。
    深度学习——数据预处理篇_第2张图片

  2. 数据归一化(normalization)

    归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。举个容易理解的例子,在房价预测那题中,假设房价是由面积s和卧室数b决定,面积s在0200之间,卧室数b在05之间,则进行归一化就是s=s/200,b=b/5. 就是把这两个数据"归到1内",所以叫归一化。

    通常我们有两种方法来实现归一化:

    • 一个是在数据都去均值之后,每个维度上的数据都除以这个维度上数据的标准差,即

      X /= np.std(X, axis = 0)
      
    • 另外一种方式是我们除以数据绝对值的最大值,以保证所有的数据归一化后都在-1到1之间。如上述的房价例子。

    如图normalized data即为归一化

    深度学习——数据预处理篇_第3张图片

  3. 主成分分析(PCA、Principal Component Analysis)

    这是一种使用广泛的数据降维算法,是一种无监督学习方法,主要是用来将特征的主要分成找出,并去掉基本无关的成分,从而达到降维的目的。

    总结一下PCA的算法步骤:
    设有n条m维数据。

    1. 将原始数据按列组成m行n列矩阵X

    2. 将X的每一行(代表一个属性字段)进行零均值化

    3. 求出协方差矩阵
      C = 1 m X X T C=\frac{1}{m}XX^{T} C=m1XXT

    4. 求出协方差矩阵的特征值及对应的特征向量

    5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

    6. Y=P×X即为降维到k维后的数据

    深度学习——数据预处理篇_第4张图片

    深度学习——数据预处理篇_第5张图片

    代码如下:

    # 假定输入数据矩阵X是[N*D]维的
    X -= np.mean(X, axis = 0) # 去均值
    cov = np.dot(X.T, X) / X.shape[0] # 计算协方差
    U,S,V = np.linalg.svd(cov)
    Xrot = np.dot(X, U) # decorrelate the data
    Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced becomes [N x 100]
    
    

    PCA处理结果如图中的decorrelated data:深度学习——数据预处理篇_第6张图片

  4. 白化(whitening)

    就是把各个特征轴上的数据除以对应特征值,从而达到在每个特征轴上都归一化幅度的结果。也就是在PCA的基础上再除以每一个特征的标准差,以使其normalization,其标准差就是奇异值的平方根:

    # whiten the data:
    # divide by the eigenvalues (which are square roots of the singular values)
    Xwhite = Xrot / np.sqrt(S + 1e-5)
    

    但是白化因为将数据都处理到同一个范围内了,所以如果原始数据有原本影响不大的噪声,它原本小幅的噪声也会放大到与全局相同的范围内了。
    另外我们为了防止出现除以0的情况在分母处多加了0.00001,如果增大他会使噪声减小。
    白化之后得到是一个多元高斯分布,如下图whitened所示:

    深度学习——数据预处理篇_第7张图片

    可以看出经过PCA的去相关操作,将原始数据的坐标旋转,并且可以看出x方向的信息量比较大,如果只选一个特征,那么就选横轴方向的特征,经过白化之后数据进入了相同的范围。

三、注意事项

以上只是总结数据预处理的方法而已,并不是说每次都会用这么多方法,相反,在图像数据处理或者CNN中,一般只需要进行去均值和归一化,不需要PCA和白化

代码如下:

X -= np.mean(X, axis = 0) # 减去均值,使得以0为中心
X /= np.std(X, axis = 0) # 归一化

深度学习——数据预处理篇_第8张图片

常见陷阱:在进行数据的预处理时(比如计算数据均值),我们只能在训练数据上进行,然后应用到验证/测试数据上。如果我们对整个数据集-整个数据集的均值,然后再进行训练/验证/测试数据的分割的话,这样是不对的。正确做法是计算训练数据的均值,然后分别把它从训练/验证/测试数据中减去。

四、References

  • https://blog.csdn.net/bea_tree/article/details/51519844#commentBox
  • https://blog.csdn.net/han_xiaoyang/article/details/50451460#commentBox
  • http://ufldl.stanford.edu/wiki/index.php/数据预处理#PCA.2FZCA.E7.99.BD.E5.8C.96

你可能感兴趣的:(深度学习)