https://www.yuque.com/lart/ml-newer
版本号
|
作者
|
时间
|
改动内容
|
0.1
|
Lart
|
2018年10月17日
|
创建文档
|
0.2
|
Lart
|
2018年10月18日10:55:22
|
调整结构
|
0.3
|
Lart
|
2018年10月18日11:26:14
|
补充保存数据的内容
|
虽然这里有一系列可行的方法,但是这一步通常是根据数据的具体情况而明确选择的. 这一方法对诸如自然图像这类数据是有效的,但对非平稳的数据则不然.特征归一化常用的方法包含如下几种:
简单缩放
通过对数据的每一个维度的值进行重新调节(这些维度可能是相互独立的),使得最终的数据向量 落在 [0,1]或[ -1,1] 的区间内(根据数据情况而定).这对后续的处理十分重要,因为很多 默认参数(如 PCA-白化中的 epsilon)都假定数据已被缩放到合理区间.
例子 在处理自然图像时,我们获得的像素值在 [0,255] 区间中,常用的处理是将这些像素值除以 255,使它们缩放到 [0,1] 中.
逐样本均值消减(也称为移除直流分量)
前提:数据要求是平稳的.
对于每个图像样本,减去各自各个通道上的整幅图像的均值.
因为具体来说,是因为不同色彩通道中的像素并不都存在平稳特性.
例子 在实验中,在ZCA whitening前进行数据预处理时,每列代表一个样本,但为什么是对patches每一维度0均值化?
(具体做法是:首先计算每一个维度上数据的均值,使用全体数据计算,之后再每一个维度上都减去该均值)
而以前的实验都是对每个样本整体进行0均值化(即:逐样本均值消减)?
特征标准化(使数据集中所有特征都具有 零均值和单位方差)
独立地使得数据的每一个维度具有零均值和单位方差.
这是归一化中最常见的方法并被广泛地使用.
特征标准化的具体做法是:
例子
https://blog.csdn.net/danieljianfeng/article/details/42147109
白化可以降低输入的冗余性,降低特征之间的相关性,使得所有的特征具有相同的方差.
在做完简单的归一化后,白化通常会被用来作为接下来的预处理步骤,它会使我们的算法工作得更好.实际上许多深度学习算法都依赖于白化来获得好的特征.
在进行白化时,首先使 特征零均值化 是很有必要的.
白化处理分PCA白化和ZCA白化.
ZCA白化首先通过PCA去除了各个特征之间的相关性,然后使得输入特征具有相同方差,此时得到PCA白化后的处理结果.然后再把数据旋转回去,得到ZCA白化的处理结果.
二者的差异:
# 假设输入数据矩阵X的尺寸为[N x 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) # 对数据去相关性
# 对数据进行白化操作 除以特征值->PCA白化
Xwhite = Xrot / np.sqrt(S + 1e-5)
# 转换为原始基->ZCA白化
Xzcawhite = np.dot(Xwhite, U.T)
注意 对于大图像,采用基于 PCA/ZCA 的白化方法是不切实际的,因为协方差矩阵太大.在这些情况下我们退而使用 1/f 白化方法.
接下来在 PCA/ZCA 白化中我们需要选择合适的 epsilon
(回忆一下,这是规则化项,对数据有低通滤波作用). 选取合适的 epsilon
值对特征学习起着很大作用,这里可以看ML预处理.md文档 PCA/ZCA白化 一节.
实际建议
在卷积神经网络中并不会采用这些PCA以及白化变换.然而对数据进行零中心化操作还是非常重要的,对每个像素进行归一化也很常见.
在这一部分中,我们将介绍几种在一些数据集上有良好表现的预处理标准流程.
均值消减->PCS/ZCA白化
灰度图像具有平稳特性,通常在第一步对每个数据样本分别做均值消减(即减去直流分量),然后采用 PCA/ZCA 白化处理.
其中的 epsilon
要__足够大以达到低通滤波__的效果.
分通道均值消减->PCA/ZCA白化
对于彩色图像,色彩通道间并不存在平稳特性.通常需要分通道均值消减,并且对数据进行特征缩放(使像素值位于 [0,1] 区间).
使用足够大的 epsilon
来做 PCA/ZCA.
特征标准化->PCA/ZCA 白化
对于音频数据 (MFCC 和频谱图),每一维度的取值范围(方差)不同.
即使得数据的每一维度均值为0、方差为1,然后进行PCA/ZCA白化(使用合适的 epsilon
).
简单缩放/逐样本均值消减(->PCA/ZCA 白化)
MNIST 数据集的像素值在 [0,255] 区间中.我们首先将其缩放到 [0,1] 区间.
实际上,进行逐样本均值消去也有助于特征学习.
注:也可选择以对 MNIST 进行 PCA/ZCA 白化,但这在实践中不常用.
独热编码即 One-Hot 编码,又称一位有效编码,其方法是__使用N位状态寄存器来对N个状态进行编码__,每个状态都由他独立的寄存器位,并且__在任意时候,其中只有一位有效__.
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征.并且,这些特征互斥,每次只有一个激活.因此,数据会变成稀疏的.
稀疏数据相比密集数据而言,对于计算机加载处理也更为有优势.
这样做的好处主要有:
实际建议
对于标签数据可以转化为独热编码形式,这对于网络的分类输出而言,是更为实际的表达形式.
from keras.utils import np_utils
...
Y_train = np_utils.to_categorical(y_train, num_classes)
而对于真实的类别序号可以通过使用NumPy argmax()
函数来找到(这里的查找,也不一定对one-hot后的数据进行查找,对于得分数据亦可以,对于softmax计算后的也可以,因为是增函数).
https://blog.csdn.net/mzpmzk/article/details/80039481
https://blog.csdn.net/u010555688/article/details/60757932?utm_source=blogxgwz1
深层神经网络一般都需要大量的训练数据才能获得比较理想的结果。在 数据量有限的情况 下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟合。
图片数据增强通常只是针对训练数据,对于测试数据则用得较少。测试数据常用的是:做 5 次随机剪裁,然后将 5 张图片的预测结果做均值。
常用手段:
将训练集数据/标签,以及测试数据(可能有的标签),都事先处理后, 并转化好 .npy
或者其他的整合的数据文件, 便于后期的分布处理,而且也可以减少训练过程在读入数据上的处理时间.
https://gist.github.com/lartpang/e2343fb06f25b36a8af03e68923dea06
处理离散型特征和连续型特征并存的情况时,必须进行特征的归一化,每个特征都单独进行归一化.对于连续型特征归一化的常用方法是放缩后标准化,对于离散的特征基本就是按照one-hot编码,该离散特征有多少取值,就用多少维来表示该特征.
基于树的方法是不需要进行特征的归一化,例如随机森林, bagging 和 boosting等.基于参数的模型或基于距离的模型,都是要进行特征的归一化.
进行预处理很重要的一点是:任何预处理策略(比如数据均值)都 只能在训练集数据上进行计算,算法训练完毕后再应用到验证集或者测试集上。
例子 如果先计算整个数据集图像的平均值然后每张图片都减去平均值,最后将整个数据集分成训练/验证/测试集,那么这个做法是错误的。应该怎么做呢?应该先分成训练/验证/测试集,只是从训练集中求图片平均值,然后各个集(训练/验证/测试集)中的图像再减去这个平均值。
对于神经网络模型而言,图片需要进行预处理的原因: