都说算法调参其实都是经验过程,此话有理。
这是以前遇到的坑:
加入BN层后预测与训练时准确率差距很大解决方案,is_traing参数(ResNet,GoogLeNet,Inception)
卷积神经网络提高准确率(shuffle,优化器,batchsize,权重初始化)通过某次实际CNN调参过程
在以前坑都解决的情况下,这次使用同样的网络解决一个类似的问题
任务目标
区分图像是否左右颠倒(因为是试纸检测,这个很重要),而且opencv无法处理,包括直方图等数字图像处理方法
正常图片:
颠倒图片:
所以拟定使用一个2M模型的CNN做分类。
直接看最后--解决,问题这一节只是记录下心路历程
问题
发生了这种一直0.5正确率,严重偏斜的问题
这是我某下午的思考过程:
甚至我产生这样的思考:通常来讲,做图像增强时,扩展数据时使用切割、翻转、加噪声等方式获得更多的图像,扩充训练集,CNN学习到的东西就是图像特征而无关正反图像等。后来还做了每个batch图片可视化以及中间层数据可视化,但是都无济于事。
解决
一定要贴合数据集本身的特点!
首先,将图片一分为3,这样特征就更加明显了,人眼也一下就能识别出不同,可以定义为两类。
正常图片:
颠倒图片:
但是!这个数据集还有一个特点,就是高原起手(梯度下降等同与下山,但是这个数据集就是最开始位于一个高原,所以一定要训练一定时间,才能有结果),tensorboard,是mini-batch的训练方式,大概35步为跑完一个训练集,所以7K步等价于200轮迭代,在前3、4K步时仍旧表示为0.5左右准确率,所以让我非常怀疑人生,以为各种错误,结果就是训练次数不够,无论什么学习率等参数都不行:
但是,以上这样的可视化图还是挺奇怪的,为啥训练集和验证集会产生这样的延迟反应?(但是tensorboard可视化也不一定可全信,因为它会自动修正,发生错误时也告诉我训练集表现良好,我手动一测,表现并不好)
知道了,因为采用了全局平均池化层,该层的好处是速度快,模型小,避免过拟合,对输入空间更鲁棒,缺点是收敛速度慢。一些猜想是利用该层代替FC层导致了训练压力到卷积层所以卷积学习到的特征更加高级,收敛更慢。
总结
1.在保证网络绝对没问题的情况下,各种参数都没有问题,但是就是看不到结果,不妨狠下心来,学习率调整到一个较小的值,降低点效率保证结果准确,然后训练个一天一夜(像这种小网络,训练个几小时),再看看结果
2.利用好数据集本身的特点,这点太难了,都是摸索,泛泛而谈。
哦对,再有一点,不是adam这种优化器一定比SGD好,好多论文研究都是使用SGD,它虽然慢,但是基本都会有结果,这是它为什么经久不衰的地方