问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深度学习中的数据预处理方法详解

创作时间:
作者:
@小白创作中心

深度学习中的数据预处理方法详解

引用
CSDN
1.
https://blog.csdn.net/LLyj_/article/details/87606704

数据预处理是深度学习中一个至关重要的环节,它直接影响模型的训练效果和性能。本文将详细介绍深度学习中常用的数据预处理方法,包括零均值化、数据归一化、主成分分析(PCA)和白化等技术,并通过具体的代码示例帮助读者理解这些方法的实现方式。

一、前言

深度学习和机器学习的一个重要区别在于数据量的大小。大量实验和工作证明,数据量的大小能够直接影响深度学习的性能。目前的事实是,在小数据集上使用深度学习往往效果不如预期理想。因此,数据对深度学习的重要性不言而喻。数据预处理在众多深度学习算法中都起着重要作用。首先数据的采集就非常的费时费力,因为这些数据需要考虑各种因素,然后有时还需对数据进行繁琐的标注。当这些都有了后,就相当于我们有了原始的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了。几何上的展现是可以将数据的中心移到坐标原点。

零均值化的代码为:

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=m1 XXT

  1. 求出协方差矩阵的特征值及对应的特征向量
  2. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
  3. 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

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号