卷积神经网络(三)——调参

目录

1. 更多的优化算法

(1)随机梯度下降

(2)动量梯度下降

(3)AdaGrad算法

(4)RMSProp算法

(5)Adam算法

 (6)  学习率自适应

2. 激活函数

(1)sigmoid函数

(2)Tanh函数

(3)ReLU(Rectified Linear Unit)

(4)Leaky-ReLU

(5)ELU

(6)Maxout

3. 网格初始化

(1) 全部为0

(2) 如何分析初始化结果好不好?

4. 批归一化

5. 数据增强

(1)归一化

(2)图像变换

(3)色彩变换

(4)多尺度裁剪

6. 更多调参技巧

(1) 拿到更多的数据

(2) 给神经网络添加层次

(3) 紧跟最新进展,使用新方法

(4) 增大训练的迭代次数

(5) 尝试使用正则化​

(6) 使用更多的GPU来加速训练

(7) 可视化工具来检查中间状态

(8) 在标准数据集上训练

(9) 在小数据集上过拟合

(10) 数据集分布均衡

(11)  使用预调整好的稳定的模型结构

(12) Fine-tuning,基于公开的模型,参数,进行微调。


1. 更多的优化算法

(1)随机梯度下降

            局部极值

            saddle point问题

(2)动量梯度下降

随机梯度下降和动量梯度下降存在的问题:

        受初始学习率影响很大

        每一个维度的学习率一样

(3)AdaGrad算法

前期,regularizer较小,放大梯度

后期,regularizer较大,缩小梯度

梯度随训练次数降低

每个分量有不同的学习率

缺点:

学习率设置太大,导致regularizer影响过于敏感

后期,regularizer累积值太大,提前结束训练

(4)RMSProp算法

Adagrad的变种

由累积平方梯度变为平均平方梯度

解决了后期提前结束的问题

(5)Adam算法

所有的上述算法都会用learning_reat来做参数

Adam比较有效:beta1 = 0.9,beta2 = 0.999,learning_rate = 1e-3 or 5e-4

 (6)  学习率自适应

其中α0为学习率的初始值,k为系数,t为迭代次数。

Exponential decay和1/t decay表示学习率随着迭代次数的增加而减小。

总结:

2. 激活函数

(1)sigmoid函数

输入非常大或非常小时没有梯度

输出均值非0(输出均值非0,对神经网络的学习不友好,why

exp计算复杂

梯度消失:df(x) / dx = f(x)(1-f(x))

f(x)在0—1之间,1-f(x)也在0—1之间,故f(x)(1-f(x))也在0—1之间。没经过一层,其梯度都要乘以小于1的数,不经过几层,梯度就会变得很小。故,用sigmoid函数,其网络层次较深,底层参数得不到更新。

(2)Tanh函数

依旧没有梯度

输出均值为0

计算复杂

(3)ReLU(Rectified Linear Unit)

不饱和(梯度不会过小)

计算量小

收敛速度快

输出均值非0

Dead ReLU:一个非常大的梯度,使x经过调整后,输出得到负值,其导数是0,得不到更新,一直处在负值,不会有激活现象。(可用Leaky-ReLU解决)

(4)Leaky-ReLU

f(x) = max(0.01x, x), 在x为负数时,依旧有梯度。

解决dead relu的问题

(5)ELU

      均值更接近0

      小于0时计算量大

(6)Maxout

ReLU的泛化版本。ReLU 

没有dead relu

参数double

总结:

  • Relu:小心设置learning rate,因为relu的导数本来就比较大
  • 不要使用sigmoid,因为计算量太大
  • 使用leaky relu,maxout,elu
  • 可以试试tanh,但不要抱太大希望

3. 网格初始化

(1) 全部为0

单层网络可以

多层网络会使梯度消失(由于链式法则)

(2) 如何分析初始化结果好不好?

查看初始化后各层的激活值(即神经元经过激活函数的输出)分布,若激活值是在固定的区间内,比如归一化好的0——1,-1——1等比较固定的分布,认为比较好。若集中在某个值上,则认为其是不好的初始化方法。

Eg:均值为0,方差为0.02的正太分布初始化,tanh,relu激活函数。

4. 批归一化

每个batch上做归一化,存在的问题——当数据量特别大时,每个batch并不能反应每个数据的分布。此时,本来卷积神经网络对样本已经提出来一个特征,但是做归一化之后,可能会使这种特征在批与批之间不能够区分特定的样本。解决办法——逆归一化。

5. 数据增强

详见:
数据 增强_zhao_crystal的博客-CSDN博客目录1. 数据增强在tf中的实现2. 实战1. 数据增强在tf中的实现通过keras.preprocessing.image.ImageDataGenerator接口来实现数据增强rescale = 1./255, # 将所有的像素点缩放到0——1,因为所有的像素点的值在0——255之间。rotation_range = 40, # 图像增强的一种方式,比如 ratation_range = 40, 表示将图像随机旋转的角度为-40——40度之间。width_shift_rahttps://blog.csdn.net/zhao_crystal/article/details/123157815

6. 迁移学习(Fine-tuning)基于公开的模型,参数,进行微调。

详见:

迁移 学习_zhao_crystal的博客-CSDN博客目录1. fine_tune实战1.1 读取数据1.2构建模型1.2.1 resnet模型不训练1.2.2resnet模型部分层次训练1.2.3 效果对比迁移学习:是利用之前训练好的模型,在当前的任务上进行提升。Fine_tune 训练较少次数即可以得到较好的模型1. fine_tune实战使用10 monkeys数据集1.1 读取数据# 通过height, width 参数来将输入的图片规整为统一的尺寸height = 224 # 图片的长wi..https://blog.csdn.net/zhao_crystal/article/details/123157876?spm=1001.2014.3001.5502

7. 更多调参技巧

(1) 拿到更多的数据

(2) 给神经网络添加层次

 一般是逐步增加网络层次,方便定位问题。

(3) 紧跟最新进展,使用新方法

(4) 增大训练的迭代次数

 此方法需要和其它手段并行使用,比如,之前网络达到20%的错误率,已比较接近最终的效果,此时可适当的降低学习率,再继续进行学习,当学习迭代次数较多时,可能会达到意想不到的突破。

(5) 尝试使用正则化

正则化是机器学习中防止过拟合的一个方法,一个神经网络的容量是由参数的个数决定的,当参数的个数过多时,容易发生过拟合,此时可加1个正则化项(参数的平方值)

(6) 使用更多的GPU来加速训练

(7) 可视化工具来检查中间状态

损失函数的值:可分别打印出来在训练集和测试集上的损失函数的值的比较,在同样的训练次数下,训练集上的值和测试集上的值分别是怎样的

梯度:梯度的分布决定了训练的神经网络的程度如何。

当所有的梯度都比较小时,说明神经网络快要训练完了。

若梯度比较大时,说明神经网络还需要一定的时间进行训练,才能达到收敛效果。

准确率:训练集和测试集准确率的对比

学习率:很多优化方法可调整学习率,把学习率打印出来之后,即可知当前的学习率,若学习率比较低时,即说明模型即将训练完了。或训练方法,优化方法已经使得此网络不能再继续训练下去了,此时,还想继续训练,可手动调整学习率。

可视化图形如下图所示

(8) 在标准数据集上训练

(9) 在小数据集上过拟合

  在小数据集上去测试,达到过拟合的效果。

(10) 数据集分布均衡

(11)  使用预调整好的稳定的模型结构

  • 0
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值