keras做CNN的训练误差loss的下降操作

2020-06-22 17:59 来源:易采站长站 作者:于海丽 点击: 评论:

A-A+

原标题:keras做CNN的训练误差loss的下降操作

采用二值判断如果确认是噪声,用该点上面一个灰度进行替换。

噪声点处理:对原点周围的八个点进行扫描,比较。当该点像素值与周围8个点的值小于N时,此点为噪点 。

处理后的文件大小只有原文件小的三分之一,前后的图片内容肉眼几乎无法察觉。

但是这样处理后图片放入CNN中在其他条件不变的情况下,模型loss无法下降,二分类图片,loss一直在8-9之间。准确率维持在0.5,同时,测试集的训练误差持续下降,但是准确率也在0.5徘徊。大概真是需要误差,让优化方法从局部最优跳出来。

使用的activation function是relu,full connection layer是softmax分类函数,优化方法为RMsprop

难到是需要加入噪音更好,CNN中加入高斯噪音不是让模型更稳健的吗?还有让模型跳出局部最优的好处,方便训练。

原意:降噪的目的是因为这批数据是样本较少,用复印机 扫面出来的图片,想着放入更干净的数据,模型更容易学习到本质特征。

结果事与愿违,但是在keras中是可以加入noise的,比如加入高斯噪音

form keras.layers.noise import GaussianNoise

我在全连接层中加入

model.add(GaussianNoise(0.125))

后来查看了BatchNormalization的作用,发现在这个大杀器之后,好像很少有人用到初始化和其他的tricks,就可以让模型表现的很好。

在第一层的Maxpooling后面加上,model.add(BatchNormalization()),效果非常显著,第一次epoch的loss值只有0.63,acc也迅速上升,不会出现之前的卡在8.354一直不动,哪怕更换 leraning rate和使用Adagrad,都是一样的,如果前面的5个epoch完,还是没有太大的变化,后面几乎不会收敛。

1,leraning rate的设置

#导入模块,以rmsprop为例
from keras.optimizers import rmsprop
rmsprop=rmsprop(lr=0.1)#只是更改了学习率,其他的参数没有更改,默认学习率是0.001

2.BatchNormalization()的设置

from keras.layers.normalization import BatchNormalization

#网上不少人说,批规范化 加在输入层的激活函数(层)的前面

model.add(BatchNormalization())

也有看到每一个隐藏层的激活函数前面全部加上BN的,但是我这个实验中,效果很差。

3.在输入数据的时候,依然加上train_x = data/255.0,对像素矩阵的取值放小到0-1之间,否则训练将很艰难。

其实在我自己的实验中,后来调整成:

train_x-= np.mean(train_x, axis = 0)

发现效果更好

4.如果第一次的epoch的loss在个位数,则很可能需要返回去重新构建模型,加入更多的trick,如果最后的loss值依然没有达到小数,则也可能是难于训练,也需要加入其他的技巧。或者模型搭建的有问题,需要慎重检查。

【易采站长站编辑:秋军】