浅谈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的迭代器和生成器使用实例
Jan 14 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
django加载本地html的方法
May 27 Python
Python 中导入csv数据的三种方法
Nov 01 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
Python异常模块traceback用法实例分析
Oct 22 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
利用python控制Autocad:pyautocad方式
Jun 01 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
php制作简单模版引擎
2016/04/07 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
js解决movebox移动问题
2016/03/29 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
pandas的object对象转时间对象的方法
2018/04/11 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
对python 调用类属性的方法详解
2019/07/02 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
python 实现兔子生兔子示例
2019/11/21 Python
python怎么判断模块安装完成
2020/06/19 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
优秀毕业大学生推荐信
2013/11/13 职场文书
考试违纪检讨书
2014/02/02 职场文书
倡议书格式及范文
2015/04/29 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
Django框架中模型的用法
2022/06/10 Python