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 ...
随机推荐
- 本机无oracle,远程连接
描述 本机无oracle,通过PLSQL Developer程序,连接虚拟机中的oracle11gR2 1 下载instant-client 需要和服务端版本对应 下载相应的instant-clien ...
- Babel(1)认识Babel
阅读文档 Babel中文网 关于 Babel 你必须知道的 如何写好.babelrc?Babel的presets和plugins配置解析 不容错过的 Babel 7 知识汇总 一口(很长的)气了解 b ...
- Codeforces 459C Pashmak and Buses 机智数学题
这个题目说的是有n个人,有k辆巴士,有m天,每天都要安排n个人坐巴士(可以有巴士为空),为了使得这n个人不会成为朋友,只要每两个人在这m天里坐的巴士至少一天不相同即可. 要你求是否有这样的安排方法,如 ...
- 课程作业02-1-课后作业1-(1)使用组合数公式利用n!来计算
1.设计思想:运用递归阶乘的函数,依次求出n!.k!.(n-k)!,再根据组合数的公式计算(n!/(k!*(n-k)!)). 2.程序流程图: 3.源程序代码: //信1605-3 20163429 ...
- UVA - 10570 Meeting with Aliens(外星人聚会)(暴力枚举)
题意:输入1~n的一个排列(3<=n<=500),每次可以交换两个整数.用最少的交换次数把排列变成1~n的一个环状序列. 分析:正序反序皆可.枚举每一个起点,求最少交换次数,取最小值. 求 ...
- 常见的http错误
错误类型: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 2xx (成功) 表示成功处理了请求的状态代码. 3xx (重定向) 表示要完成请求,需要进一步操作. 通常,这些状态 ...
- Angular全局数据管理与同步更新
自定义实现angular中数据的状态管理,如有不妥请指正 一.先介绍一下rxjs中subject: Import {subject}from’rxjs’ Subject 数据的订阅与分发,结合报刊的发 ...
- LA_4730 Kingdom 并查集+树状数组
给定N个点的坐标,代表N各城市,有M种操作,共分两种,一种是连线,把两个点连起来(一旦构成连通图,这个连通图即为一个州),还有种询问操作,为y=c,(c为小数部分恒为.5的实数),问y=c这条线经过了 ...
- linux下的hashpump安装及使用
hashpump是linux上的一个进行hash长度拓展攻击的工具,安装过程如下: git clone https://github.com/bwall/HashPump apt-get instal ...
- JAVA中汉字的Compare排序
当调用String.compare方法的时候,比较的是Unicode码,并不能对汉字进行准确的排序,所以汉字比较时会出现比较混乱的结果. java.text.Collator类中有一个getInsta ...