tips/tricks in deep neural network

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,得到协方差矩阵的特征值和特征向量

image

step2: 把特征向量除以对应特征值的方差归一化

image

3、初始化

1、0均值初始化

每个神经元都输出相同的值,反向传播时候梯度都是相同的,而我们希望神经元之间不同,从而能学习到不同的特征。

2、用小随机数初始化

对于层次不深的网络ok,对于过深的网络发现激活传递存存在阻碍(也就是激活传递到后面发现已经是均值为0,方差为0的分布了)

clipboard

3、利用大的随机数初始化

clipboard

从上图可以看出,神经元输出不是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

image_thumb[11]

问题:输出易饱和,输出不是0均值

5.2tanh

image_thumb[10]

输出0均值,但是没有解决饱和问题。

5.3 relu

image_thumb[12]

计算简单,不会饱和,并且收敛速度快。

但是如果学习率过大,或者初始化不恰当,神经元变为负,那么反向传播时导数为0,这就是所说的dying relu问题。

下面的relu变体几乎都是为了解决这个问题。

5.4 leaky relu

image_thumb[13]

为了解决dying relu问题。

5.5 prelu

image_thumb[17]

在x<0的部分,增加了一个参数ai。

5.6 randomized relu

训练时随机确定ai,测试时固定ai。

image_thumb[19]

6、regularzations

6.1 L2正则化

倾向于使用更多的维度表示,防止过拟合。

6.2 L1正则化

稀疏性,一般而言L2效果更好。

6.3 max norm constrains
6.4 dropout

7、分析图

image_thumb[20]

首先使用比较高的学习率,再使用比较低的学习率

image_thumb[22]

上图中总体的趋势比较平,那么学习率就是太低,如果总体的趋势并没有减少,那么学习率过高,对应图1中的绿色的线。

曲线的宽度代表着每次mini batch的梯度变化,mini batch越大,所计算的梯度越接近于全部训练集梯度,此时曲线就越窄。

image_thumb[24]

红色的曲线代表训练集的准确率,绿色的曲线代表验证集的准确率,中间的gap越大,就证明已经过拟合了,这个时候需要增加正则的力度。如果没有gap,说明训练集和验证集对于这个网络没啥区别,网络并没有从训练集中学习到任何东西,说明网络的学习性能太差了。此时需要增加模型的容量。

8、集成学习

在机器学习中会训练多个学习器,然后把他们通过某个策略结合起来,取得比较好的效果。

8.1 相同的模型不同的初始化
8.2 通过交叉验证选择超参数,选择多个top model
8.3 单一的模型不同的检查点
8.4 多个模型通过不同的数据集进行训练
9、不均匀分布的数据集

对于类别之前数据量不同,对结果产生不良的影响。

9.1、通过过采样平衡数据集的数量
9.2、特殊的剪裁增加数据
9.3、对不同的分类数据,分步fine-tuning模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值