上一篇文章还是基于CNN的人脸性别识别,但是这一篇直接啥都变了,这是为啥呢。。。因为我老板说了,学习CNN只是为了热身,真正想让学的是FCN,是的,也就是用来分割的FCN。好吧,我也只能听命。
FCN的代码网上都有,我也是直接借鉴的,这里不多说,这篇文章主要记录一下我在调参路上的艰辛旅程。
首先我先记录一下我所搜集的所有可能有助于对抗过拟合的方法(是的,因为我的数据集较小,只能从别的方面下手):
1、参数范数惩罚,即L1、L2正则化 (L2比L1好,更容易求解)
2、数据增强,即将原数据给裁剪,或加入噪声,或翻转图像,使用更多的数据来训练网络
3、提前终止,可以有效的减缓过拟合现象
4、RNN中用到的参数共享,在其整条时间链上可以进行参数的共享,这样才使得其能够被训练.
5、bagging 和其他集成方法
其实bagging的方法是可以起到正则化的作用,因为正则化就是要减少泛化误差,而bagging的方法可以组合多个模型起到减 少泛化误差的作用.
在深度学习中同样可以使用此方法,但是其会增加计算和存储的成本
6、dropout
7、辅助分类节点
Google Inception V1中,采用了辅助分类节点的策略,即将中间某一层的输出用作分类,并按一个较小的权重加到最终的分 类结果中,这样相当于做了模型的融合,同时给网络增加了反向传播的梯度信号,提供了额外的正则化的思想.
8. Batch Normalization
在Google Inception V2中所采用,是一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同时收敛后分 类的准确率也可以大幅度的提高.
BN在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正太分布,减少了 Internal convariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练 困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍.
9、可变的学习率
import tensorflow as tf
global_step = tf.Variable(0, trainable=False)
initial_learning_rate = 0.1 #初始学习率14、使用momentum优化函数
当然,这些方法不一定都有用,我也只是暂时搜集了这么多,只能慢慢的来花时间来验证到底有没有用。后面的那几个网络我也只是想参考一下结构,看能不能借鉴到FCN里。
查到BN:由于网络结构越深,则后面网络层的输入发生的偏移越大,则对于网络的收敛越不利,所以BN 的思想就是对网络中的每一层都做规范化,也就是均值为0方差为1的标准正态分布,这样可以使得输入值可以落在非线性函数对于输入比较敏感的地方,也就是说让梯度变大,避免梯度消失的问题。