keras做CNN的训练误差loss的下降操作
作者:fitzgerald0 发布时间:2023-09-03 07:41:07
采用二值判断如果确认是噪声,用该点上面一个灰度进行替换。
噪声点处理:对原点周围的八个点进行扫描,比较。当该点像素值与周围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不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。(最不好的情况)
来源:https://blog.csdn.net/fitzgerald0/article/details/79002018
猜你喜欢
- 南京的炎炎夏日也未能挡住书友会朋友们的参与,下午两点半我们正式开始了这个月的话题:“浏览器”。一开始大家大致上说了一些自己认为各浏览器中各自
- 大家知道,Microsoft为了更好地预防恶意用户和攻击者的攻击,在默认情况下,没有将 IIS6.0 安装到 Windows Server
- 以前写过《 10条影响CSS渲染速度的写法与建议》,今天放些数据出来,供参考;首先说明一点,CSS对网页的最后渲染出来的速度影响非
- 事实上,当我们向文件导入某个模块时,导入的是
- 是因工作需要做的一个批量修改代码的小东西,拿出来与大家分享。 目前可以处理的文件类型:.asp .inc .htm .html
- <!--#include file="config.asp" -->&nbs
- 一、安装Pyinstaller环境:python3.6、window10注意事项:python64位版本打包的exe,只能在64位操作系统使
- ARIMA模型ARIMA模型的全称是自回归移动平均模型,是用来预测时间序列的一种常用的统计模型,一般记作ARIMA(p,d,q)。ARIMA
- 1.SocketServer模块编写的TCP服务器端代码Socketserver原理图服务端:import SocketServer &nb
- 本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下# -*- coding:utf-8 -*-# @Time
- 上一篇:微软建议的ASP性能优化28条守则(6) 技巧 20:避免在循环语句中使用字符串串联 许多人在循环语句中建立一个字符串,如下所示:
- Flask框架难学吗?它和Django哪个更容易一些,这可能是学Python web开发的同学经常问的问题,下面来说一下flask框架。Fl
- yagmail 实现发邮件yagmail 可以更简单的来实现自动发邮件功能。1、安装pip install yagmail2、简单举例imp
- 最近 全栈数据工程师养成攻略 的微信群已经将近500人,开了二群之后为了打通不同微信群之间的消息,花了点时间做了个消息同步机器人,在任意群收
- 1 使用Flask处理表单什么是表单(Form)? 表单是搜集用户数据信息的各种表单元素的集合区域。它的作用是实现用户和服务器的数据交互。通
- 网页设计是由很多个不同的元素构成的,而这些元素的重要性都不同,并且有些元素还需要尤为的突出.有些元素彼此之间存在着联系,而另外的元素之间则一
- 本文实例讲述了django框架创建应用操作。分享给大家供大家参考,具体如下:18.1.5 安装Django安装Djangonod
- 一. 介绍一个计数器工具提供快速和方便的计数,Counter是一个dict的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一
- 官方文案:https://docs.python.org/zh-cn/3/library/hashlib.htmlhashlib --- 安
- 微信网页授权认证根据微信官方文档,网页授权需要四个步骤, - 用户同意授权-获取code - 通过code 获取网页授权access_tok