1、数据集的扩增
现在数据集扩增成为训练深度网络的必须步骤
1.1 水平翻转,随机剪裁,颜色抖动(color jittering)(HSV空间中,改变s和v分量)
1.2 fancy pca
step1:
计算rgb三个分量的协方差(注意转为一维)
im = cv.imread('1_1.png')#读入图片数据
b,g,r = cv.split(im)#分离通道
b_f = b.flatten() #展平 每个通道
g_f = g.flatten()
r_f = r.flatten()
step2:
计算三个通道之间的协方差
b_cov = np.cov([b_f,g_f,r_f])
step3:
计算协方差矩阵的特征值和特征向量p1,p2,p3和对应的特征值a1,a2,a3。
并计算[p1,p2,p3][k1*a1,k2*a2,k3*a3].T,其中k1,k2,k3服从0均值,方差为0.1的高斯分布。
并且每个ki都不重复,这样即使抽取到相同的样本也,经过fancy pca后也不会产生相同的效
果。
2、预处理
2.1 0均值并且标准化(对于图像每个像素的范围为0-255,所以没有必要进行标准化)
2.2 pca白化
step1: pca,得到协方差矩阵的特征值和特征向量
step2: 把特征向量除以对应特征值的方差归一化
3、初始化
1、0均值初始化
每个神经元都输出相同的值,反向传播时候梯度都是相同的,而我们希望神经元之间不同,从而能学习到不同的特征。
2、用小随机数初始化
对于层次不深的网络ok,对于过深的网络发现激活传递存存在阻碍(也就是激活传递到后面发现已经是均值为0,方差为0的分布了)
3、利用大的随机数初始化
从上图可以看出,神经元输出不是1就是-1,很明显神经元已经饱和。
3.4、xavier初始化
参数随机初始化为一个小的随机数存在一个问题:一个神经元输出的方差会随着输入神经元数量的增多而变大。对于有n个输入单元的神经元来说,考虑χ2分布,每个输入的方差是1/n时,总的方差是1,因此,我们对每个输入的标准差乘以1/sqrt(n),每个神经元的参数初始化代码为:
w = np.random.randn(n) / sqrt(n)
以上的讨论都是基于sigmod,或者tanh激活函数,对于relu激活函数采用如下的初始化:
w = np.random.randn(nn_input_dim,nn_hdim) / sqrt(2.0/nn_input_dim)
4、训练
4.1
训练的图片大小最好是2的幂次方。在训练过程中,最好使用较小的卷积核,较小的步长,zero-padding,这样不仅减少参数,而且提高准确率。常用3x3卷积,2x2池化。
4.2 学习率
通过mini-batch的大小划分学习率,通常通过观察验证集的准确率修改学习率。
4.3 fine-tuning
第一种情况,自己的数据和预训练的数据相似,如果自己的数据量较少,可以只训练最后的分类器,如果自己的数据量相当大,可以训练更多的最后的几层。
第二种情况,如果自己的数据和预训练的数据相差比较大,那就要训练更多的层,如果自己数据比较少,那就gg了。
5、激活函数
5.1 sigmod
问题:输出易饱和,输出不是0均值
5.2tanh
输出0均值,但是没有解决饱和问题。
5.3 relu
计算简单,不会饱和,并且收敛速度快。
但是如果学习率过大,或者初始化不恰当,神经元变为负,那么反向传播时导数为0,这就是所说的dying relu问题。
下面的relu变体几乎都是为了解决这个问题。
5.4 leaky relu
为了解决dying relu问题。
5.5 prelu
在x<0的部分,增加了一个参数ai。
5.6 randomized relu
训练时随机确定ai,测试时固定ai。
6、regularzations
6.1 L2正则化
倾向于使用更多的维度表示,防止过拟合。
6.2 L1正则化
稀疏性,一般而言L2效果更好。
6.3 max norm constrains
6.4 dropout
7、分析图
首先使用比较高的学习率,再使用比较低的学习率
上图中总体的趋势比较平,那么学习率就是太低,如果总体的趋势并没有减少,那么学习率过高,对应图1中的绿色的线。
曲线的宽度代表着每次mini batch的梯度变化,mini batch越大,所计算的梯度越接近于全部训练集梯度,此时曲线就越窄。
红色的曲线代表训练集的准确率,绿色的曲线代表验证集的准确率,中间的gap越大,就证明已经过拟合了,这个时候需要增加正则的力度。如果没有gap,说明训练集和验证集对于这个网络没啥区别,网络并没有从训练集中学习到任何东西,说明网络的学习性能太差了。此时需要增加模型的容量。
8、集成学习
在机器学习中会训练多个学习器,然后把他们通过某个策略结合起来,取得比较好的效果。
8.1 相同的模型不同的初始化
8.2 通过交叉验证选择超参数,选择多个top model
8.3 单一的模型不同的检查点
8.4 多个模型通过不同的数据集进行训练
9、不均匀分布的数据集
对于类别之前数据量不同,对结果产生不良的影响。
9.1、通过过采样平衡数据集的数量
9.2、特殊的剪裁增加数据
9.3、对不同的分类数据,分步fine-tuning模型