浅谈keras使用中val_acc和acc值不同步的思考


Posted in Python onJune 18, 2020

在一个比较好的数据集中,比如在分辨不同文字的任务中,一下是几个样本

浅谈keras使用中val_acc和acc值不同步的思考

使用VGG19,vol_acc和acc基本是同步保持增长的,比如

40/40 [==============================] - 23s 579ms/step - loss: 1.3896 - acc: 0.95 - val_loss: 1.3876 - val_acc: 0.95
Epoch 13/15
40/40 [==============================] - 23s 579ms/step - loss: 1.3829 - acc: 0.96 - val_loss: 1.3964 - val_acc: 0.96
Epoch 14/15
40/40 [==============================] - 23s 580ms/step - loss: 1.3844 - acc: 0.97 - val_loss: 1.3892 - val_acc: 0.97
Epoch 15/15
40/40 [==============================] - 24s 591ms/step - loss: 1.3833 - acc: 0.98 - val_loss: 1.4145 - val_acc: 0.98

这表明训练集和测试集同分布,在训练集中学习的特征确实可以应用到测试集中,这是最好的情况。

通过观察热力图也可以看到,最热的地方集中在特征上。比如在分辨不同的文字。

浅谈keras使用中val_acc和acc值不同步的思考

但很多时候,自己建立的数据集并不完美,或者可能不同类的特征分辨并不明显,这时候用cnn强行进行分类就会出现很多奇葩的情况。

考虑一种极端的情况,比如有四个类,而四个类都是同样的简单图形

浅谈keras使用中val_acc和acc值不同步的思考

那么在学习过程中,会出现如下特征的acc和vol_acc

40/40 [==============================] - 23s 579ms/step - loss: 1.3896 - acc: 0.2547 - val_loss: 1.3876 - val_acc: 0.2500
Epoch 13/15
40/40 [==============================] - 23s 579ms/step - loss: 1.3829 - acc: 0.2844 - val_loss: 1.3964 - val_acc: 0.2281
Epoch 14/15
40/40 [==============================] - 23s 580ms/step - loss: 1.3844 - acc: 0.2922 - val_loss: 1.3892 - val_acc: 0.2469
Epoch 15/15
40/40 [==============================] - 24s 591ms/step - loss: 1.3833 - acc: 0.2578 - val_loss: 1.4145 - val_acc: 0.2500

从热力图上看

浅谈keras使用中val_acc和acc值不同步的思考

可以看到因为没有什么特征,所有热力图分布也没有规律,可以说网络什么都没学到。

那么考虑中间的情况,比如很相似的类学习会怎么样?比如不同年份的硬币

浅谈keras使用中val_acc和acc值不同步的思考

40/40 [==============================] - 25s 614ms/step - loss: 0.0967 - acc: 0.9891 - val_loss: 0.3692 - val_acc: 0.8313
40/40 [==============================] - 23s 580ms/step - loss: 0.0476 - acc: 0.9953 - val_loss: 0.3994 - val_acc: 0.7906
40/40 [==============================] - 23s 578ms/step - loss: 0.0237 - acc: 0.9984 - val_loss: 0.5067 - val_acc: 0.7344
40/40 [==============================] - 23s 579ms/step - loss: 0.0184 - acc: 1.0000 - val_loss: 0.5192 - val_acc: 0.7531
40/40 [==============================] - 23s 582ms/step - loss: 0.0286 - acc: 0.9953 - val_loss: 0.9653 - val_acc: 0.6344
40/40 [==============================] - 23s 584ms/step - loss: 0.0138 - acc: 1.0000 - val_loss: 0.4780 - val_acc: 0.7688
40/40 [==============================] - 23s 583ms/step - loss: 0.0115 - acc: 0.9984 - val_loss: 0.5485 - val_acc: 0.7438
40/40 [==============================] - 23s 581ms/step - loss: 0.0096 - acc: 1.0000 - val_loss: 0.5658 - val_acc: 0.7406
40/40 [==============================] - 23s 578ms/step - loss: 0.0046 - acc: 1.0000 - val_loss: 0.5070 - val_acc: 0.7562

浅谈keras使用中val_acc和acc值不同步的思考

可以看到,虽然网络有一定分辨力,但是学习的特征位置并不对,这可能是网络的分辨力有限,或者数据集过小导致的,具体怎么解决还没有想清楚??可以看到,可以看到除非完全没有特征,否则train acc一定能到100%,但是这个是事没有意义的,这就是过拟合。

一开始同步增长,是在学习特征,后来volacc和acc开始有差异,就是过拟合

这可能是训练集过小导致的,如果图片中只有年份呢?

浅谈keras使用中val_acc和acc值不同步的思考

acc = 0.85,vol_acc=0.85
acc = 0.90,vol_acc=0.90  
acc = 0.92,vol_acc=0.92  
acc = 0.94,vol_acc=0.92

浅谈keras使用中val_acc和acc值不同步的思考

可以看到,还是能正确分类的,之所以硬币不能正确分类,是因为训练数据集过小,其他特征掩盖了年份的特征,只要增大数据量就行了。

另外。还有几点训练技巧:

1、拓展函数不要怕极端,极端的拓展函数有利于学到目标真正的特征。

2、使用灰度图作为训练集?如果以纹理为主,使用灰度图,灰度图能增强网络的鲁棒性,因为可以减少光照的影响,但是会损失颜色信息,可以用结果看看到底该使用哪种图?

3、使用小的分辨率图片可能错过某些特征,尤其是在小数据集的时候,所以可能的话使用大数据集,或者提高分辨率,根据使用者的目标。

以上这篇浅谈keras使用中val_acc和acc值不同步的思考就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
Apr 15 Python
python通过ftplib登录到ftp服务器的方法
May 08 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
python spyder中读取txt为图片的方法
Apr 27 Python
django解决跨域请求的问题
Nov 11 Python
Python函数装饰器实现方法详解
Dec 22 Python
python装饰器常见使用方法分析
Jun 26 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
Python中bisect的用法及示例详解
Jul 20 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 Python
解析python中的jsonpath 提取器
Jan 18 Python
python实现在线翻译
Jun 18 #Python
Python函数的迭代器与生成器的示例代码
Jun 18 #Python
使用python实现名片管理系统
Jun 18 #Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 #Python
浅谈keras.callbacks设置模型保存策略
Jun 18 #Python
用python实现名片管理系统
Jun 18 #Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 #Python
You might like
PHP中的extract的作用分析
2008/04/09 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
模板引擎正则表达式调试小技巧
2011/07/20 PHP
php自定义apk安装包实例
2014/10/20 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
JavaScript浏览器选项卡效果
2010/08/25 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python重要函数eval多种用法解析
2020/01/14 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
运动会口号8字
2014/06/07 职场文书
会议通知范文
2015/04/15 职场文书
学生犯错保证书
2015/05/09 职场文书
高中班主任心得体会
2016/01/07 职场文书
导游词之山东八大关
2019/12/18 职场文书
Redis高可用集群redis-cluster详解
2022/03/20 Redis