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

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

一、前言

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

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


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

  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. 主成分分析(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维后的数据

    代码如下:

    # 假定输入数据矩阵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:

  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所示:

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

三、注意事项

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

代码如下:

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

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

四、References

  • 29
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
深度学习数据集预处理深度学习算法中非常重要的一步。数据预处理的目的是为了提高深度学习算法的性能和效果。在数据预处理中,常用的方法包括零均值化(中心化)、数据归一化(normalization)、主成分分析(PCA)和白化(whitening)等。\[1\] 零均值化(中心化)是将数据的均值调整为0,这样可以消除数据的偏差。数据归一化是将数据的范围缩放到一个固定的区间,常用的方法有将数据缩放到0到1之间或者将数据标准化为均值为0,方差为1的分布。主成分分析(PCA)是一种降维的方法,通过线性变换将原始数据映射到一个新的坐标系中,使得新的坐标系中的数据具有最大的方差。白化是对数据进行线性变换,使得变换后的数据具有相互独立且方差为1的特性。 在进行数据预处理时,需要注意一些事项。首先,要根据具体的问题和数据集选择合适的预处理方法。其次,要确保数据预处理的过程不会引入额外的噪声或失去重要的信息。最后,要注意在训练集和测试集上使用相同的数据预处理方法,以保持一致性。 总之,深度学习数据集预处理是提高深度学习算法性能的重要步骤,通过合适的数据预处理方法可以提高算法的准确性和效果。\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [深度学习——数据预处理](https://blog.csdn.net/LLyj_/article/details/87606704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值