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


Posted in Python onJune 22, 2020

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

噪声点处理:对原点周围的八个点进行扫描,比较。当该点像素值与周围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值依然没有达到小数,则也可能是难于训练,也需要加入其他的技巧。或者模型搭建的有问题,需要慎重检查。

5. 建议使用网格搜索,从最重要的参数开始,搭建一个简单的模型,然后取合理的超参数,逐一进行。

6 .也可以在卷积层中加正则化,比如:

C1 = Convolution2D(8 3, 3, border_mode='valid', init='he_uniform', activation='relu',W_regularizer=l2(regularizer_params))

7.有看到在kaggle中使用集成cnn的,分类错误率确实有下降。

8 使用ReduceLROnPlateau 对学习率进行衰减,当下降很慢时,学习率自动调整,可以起到一部分作用,

我在模型中使用的是RMSprop ,RMSprop本身带有学习率的自动调整,但是,我加上ReduceLROnPlateau ,依然可以看到学习率变化很慢时,设置的这个ReduceLROnPlateau 有调整。

9 用数据增强的时候,也需要小心,图片调整的幅度等均会对模型的正确率有影响。

10,对3个颜色的图像转换为gray以后,分类准确率稳定在 0.5左右,几乎就是废掉了,说明图像的像素对于模型的影响巨大,后来了解到有“图像超分辨率重建Super-Resolution”其实是可以对图像做像素的分辨率更高。当然也是可以手工用PS进行插值等修图。查了下,像mnist这样的数据集都是经过处理后才放入模型中的,所以,不能完全指望着CNN卷积池化就把所有的问题都解决掉,尽管图像分类和识别正在像CNN转移。

keras遇到的坑(可能是水平的问题,总之有困惑)

(1) 多次运行会在上一次运行过的数据上起作用,比如,

train_x , val_x , train_y, val_y = train_test_split(train_x, train_y, test_size=0.1, random_state=random_seed)

如果多次运行,则1000个数据,900个训练集的,下一次变成,900*0.9=810个数据,同时,还发现,

train_y = to_categorical(label, num_classes =2),这里也可能出现问题,比如,二分类,在第一次运行后是,2行

第二次运行就变成4行

(2) 在做交叉验证时

新版本epoch的写法是epochs=

estimator = KerasClassifier(build_fn=baseline_model, epochs=20, batch_size=32, verbose=2)

如果用成下面老版本,则n_epoch无法读取,运行的时候,默认的是1所以我定义的 n_epoch=20是失效。

estimator = KerasClassifier(build_fn=baseline_model, n_epoch=20, batch_size=32, verbose=2)

补充知识:keras中loss与val_loss的关系

loss是训练集的损失值,val_loss是测试集的损失值

以下是loss与val_loss的变化反映出训练走向的规律总结:

train loss 不断下降,test loss不断下降,说明网络仍在学习;(最好的)

train loss 不断下降,test loss趋于不变,说明网络过拟合;(max pool或者正则化)

train loss 趋于不变,test loss不断下降,说明数据集100%有问题;(检查dataset)

train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;(减少学习率)

train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。(最不好的情况)

以上这篇keras做CNN的训练误差loss的下降操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
python实现windows壁纸定期更换功能
Jan 21 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
python3 xpath和requests应用详解
Mar 06 Python
python实现FTP循环上传文件
Mar 20 Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 Python
Python如何使用ElementTree解析xml
Oct 12 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 #Python
Python项目跨域问题解决方案
Jun 22 #Python
python os模块在系统管理中的应用
Jun 22 #Python
解决tensorflow读取本地MNITS_data失败的原因
Jun 22 #Python
python实现猜数游戏(保存游戏记录)
Jun 22 #Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 #Python
在Mac中配置Python虚拟环境过程解析
Jun 22 #Python
You might like
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
javascript计时器详解
2015/02/28 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
快速掌握Node.js之Window下配置NodeJs环境
2016/03/21 NodeJs
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
python实现图片转字符画的完整代码
2021/02/21 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
中海讯通笔试题
2015/09/15 面试题
公司委托书格式
2014/08/01 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
龙门石窟导游词
2015/02/02 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL