keras中的一些小tips(一)
写这篇博客的原因主要是为了总结下在深度学习中我们常会遇到的一些问题,以及不知道如何解决,我准备把这个部分作为一个系列,为了让大家少走一些坑,对于本博客有什么错误,欢迎大家指出,下面切入正题吧。
1. 深度学习,一个令人头疼的问题就是如何调参?
简而言之,如果数据集复杂的话,那么就要增加网络的层数,模型欠拟合了,加节点。
2. 关于验证集的loss曲线和acc曲线震荡,不平滑问题
出现loss震荡不平滑的原因可能如下:
(1) 学习率可能太大
(2) batch size太小
(3) 样本分布不均匀
(4) 加入正则化
3. 对于模型过拟合问题
(1) 换一个简单模型
(2) 增加数据
4. 对于自己定义的损失函数,如果我们加载模型常会提示loss出错,此时解决方法有两个:
(1) 首先用json保存模型用,然后保存权重,加载模型时,先load模型,然后载入权重
(2) load_model函数提供了参数,所以加载时需要加入这个参数,假设自定义参数loss的函数名为cosloss,所以加载时应采用以下方式
- model = load_model('model.h5', {'cosloss':cosloss})
5. 在keras中如果想输出训练过程中训练集合验证集准确值和损失值得变化,可以采用回调函数,具体参考以下方式:
- history=model.fit()
- plt.plot()
- plt.plot(history.history['val_acc'])
- plt.title('model accuracy')
- plt.ylabel('accuracy')
- plt.xlabel('epoch')
- plt.legend(['train', 'test'], loc='upper left')
- plt.show()
- # summarize history for loss
- plt.plot(history.history['loss'])
- plt.plot(history.history['val_loss'])
- plt.title('model loss')
- plt.ylabel('loss')
- plt.xlabel('epoch')
- plt.legend(['train', 'test'], loc='upper left')
- plt.show()
说明:如果你想把每个epoch的accuray结果保存在txt中也是可以的
- accy=history.history['acc']
- np_accy=np.array(accy)
- np.savetxt('save.txt',np_accy)
6. 如果训练中发现loss的值为NAN,这时可能的原因如下:
(1)学习率太高
(2)如果是自己定义的损失函数,这时候可能是你设计的损失函数有问题
7. 对于新手来说,一个比较困惑的地方可能就是不明白,loss值和acc之间的关系,有时候即使acc高,但是loss值也高
一般来说,较高的acc对应的loss较低,但这不是绝对,毕竟他们是两个不同的东西,所以在实际实现中,我们可以对两者进行一个微调。
8. 关于模型epoch轮数?对于一个新模型,迭代多少次才可以收敛,具体应该怎么设置
关于epoch设置问题,我们可以设置回调函数,选择验证集最高的acc作为最优模型。
9. 关于BN和dropout,应该使用哪个?
其实这两个是两个完全不同的东西,BN针对数据分布,dropout是从模型结构方面优化,所以他们两个可以一起使用,对于BN来说其不但可以防止过拟合,还可以防止梯度消失等问题,并且可以加快模型的收敛速度,但是加了BN,模型训练往往会变得慢些。
10. 这一条作为总结吧,多看看keras官方文档,里面基本能找到你需要的东西。这篇暂时就酱~
keras中的一些小tips(一)的更多相关文章
- Office 中的各种小tips(更新中)
1.Word 中打字输入会擦掉之后原有字符,出现“吃字”的情况? 要将“改写”切换为“插入”,最简单的方法就是点击键盘上小键盘旁边的“insert”键. 其实仔细观察的话,在word文档下方,会看到如 ...
- keras搭建深度学习模型的一些小tips
定义模型两种方法: 1.sequential 类仅用于层的线性堆叠,这是目前最常用的网络架构 2.函数式API,用于层组成的有向无环图,让你可以构建任意形式的架构 from keras import ...
- 你不知道的JavaScript--Item17 循环与prototype最后的几点小tips
1.优先使用数组而不是Object类型来表示有顺序的集合 ECMAScript标准并没有规定对JavaScript的Object类型中的属性的存储顺序. 但是在使用for..in循环对Object中的 ...
- keras中的mini-batch gradient descent (转)
深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 一. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看 ...
- keras中的模型保存和加载
tensorflow中的模型常常是protobuf格式,这种格式既可以是二进制也可以是文本.keras模型保存和加载与tensorflow不同,keras中的模型保存和加载往往是保存成hdf5格式. ...
- 深度学习基础系列(五)| 深入理解交叉熵函数及其在tensorflow和keras中的实现
在统计学中,损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数.假设某样本的实际输出为a,而预计的输出为y,则y与a之间存在偏差,深度学习的目的即是通过不断地 ...
- 整理一些《纸书科学计算器》的小Tips
本文最开始是在2016年的文章 Win10应用<纸书科学计算器>更新啦! 发表之后撰写的,当时那篇文章收到了不少人点赞,应用在国内市场的日下载量也突然上涨,让我感到受宠若惊,这里要感谢Wp ...
- 最近工作的一点小tips
最近工作比较忙,但也积累了一些小tips,比较杂,不成系统,也并不很深入,就开一篇笼统的先记录一下,以后再深入挖掘. 1.-webkit-tap-highlight-color -webkit-tap ...
- Unity3D性能优化小tips——把this.transform缓存缓存起来
Unity3D开发时中有一个小tips,这在官方的文档里其实有提及的,但不那么显眼,这里小说一下: 在MonoBehaviour进行编程时,我们经常会用this.transform, this.gam ...
随机推荐
- 4. Retrieving a mapper(检索映射器)
Retrieving a mapper(检索映射器) 4.1. The Mappers factory(映射工厂) 可以通过 org.mapstruct.factory.Mappers 类检索映射器实 ...
- Reference在Essay写作中的最佳占比是多少?
很多同学在写完Essay作业后 就觉得大功告成了 并不是很注重参考文献 导致查重率过高 面临抄袭.取消成绩. 甚至被退学的情况 或者在essay写作中勉强标出几处 非常随意的在后面列出 其实这是很不正 ...
- ISO处理jq事件
jq事件在IOS上,如果标签本身不具备某些功能,而我们通过document或者body绑定上去的话,有些事件是不起作用的,同时在IOS上jq事件也存在延迟. 事件不起作用 这里点击事件为例,在IOS中 ...
- Python MySQL 创建表
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- oracle问题:char类型数据查询不到
select distinct id,name from test_table b where b.ID='001' ; id为char字段类型,使用该语句查询不出数据. 解决方法:加trim().改 ...
- ES6中字符串的新增方法梳理
1.String.fromCodePoint(); String,fromCodePoint()方法可以认为是对String.fromCharCode()方法的扩展,这两个方法的共同点在于都是用于Un ...
- 使用BurpSuite和Hydra爆破相关的服务(9.25 第十一天)
使用BP和Hydra爆破相关的服务 Hydra:九头蛇,开源的功能强大的爆破工具,支持的服务有很多,使用Hydra爆破C/S架构的服务. 使用BurpSuite爆破web服务 DVWA:web应用程序 ...
- HDU - 4112 Break the Chocolate(规律)
题意:有一块n*m*k的巧克力,最终需要切成n*m*k个1*1*1的块,问用以下两种方法最少掰多少次能达到目的: 1.用手掰:每次只能拿出一块来掰:2.用刀切:可以把很多已经分开的块摞在一起一刀切下来 ...
- 洛谷 P1470 最长前缀 Longest Prefix
题目传送门 解题思路: 其实思路没那么难,就是题面不好理解,解释一下题面吧. 就是在下面的字符串中找一个子串,使其以某种方式被分解后,每部分都是上面所给集合中的元素. AC代码: #include&l ...
- Vue 获取时间戳返回自定义时间格式
直接在Vue全局函数定义: Vue.prototype.padLeftZero = function(str) { return ('00' + str).substr(str.length); }; ...