tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法
本文介绍在tensorflow
库中,用于动态调整神经网络的学习率的一种方法——指数衰减ExponentialDecay()
策略的参数含义及其具体用法。
在进行神经网络训练时,我们经常需要用到动态变化的学习率,其中指数衰减ExponentialDecay()
策略是我们常用的一种策略。在tensorflow
库中,其完整的用法是tf.keras.optimizers.schedules.ExponentialDecay()
,其中的具体参数如下所示。
tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate, decay_steps, decay_rate, staircase=False, name=None
)
首先,我们需要知道,在用了ExponentialDecay()
策略后,程序将动态调整神经网络训练过程中的学习率,且这一调整是与我们当前训练的step
有关的。具体关于step
的解释,大家可以参考文章神经网络常见参数解释:epoch、batch、batch size、step、iteration,本文就不再赘述。
如以下代码所示,使用ExponentialDecay()
策略后,程序将依据如下的规律,基于当前训练的step
,以及我们自行设定的几个参数,从而计算得到当前的学习率。其中,函数的返回值就是当前的学习率。
def decayed_learning_rate(step):
return initial_learning_rate * decay_rate ^ (step / decay_steps)
其中,initial_learning_rate * decay_rate ^ (step / decay_steps)
就是当前学习率的计算公式。这里的initial_learning_rate
、decay_rate
以及decay_steps
,就是我们前面提到的ExponentialDecay()
函数的前3
个参数。其中,initial_learning_rate
是我们的初始学习率,decay_rate
是学习率下降的速率,而decay_steps
则是学习率下降的位置(具体含义我们稍后介绍)。此外,ExponentialDecay()
策略还有两个参数,staircase
表示我们在计算(step / decay_steps)
时,是对结果向下取整还是取小数,默认为False
,即取小数结果(具体含义我们稍后介绍);最后一个name
参数,只是对当前这一学习率下降的策略加以命名,一般用不上这个参数,我们就不再介绍了。
由此,我们可以初步知道,ExponentialDecay()
函数的前4
个参数都是用来计算当前的学习率的;且结合我们前面的公式initial_learning_rate * decay_rate ^ (step / decay_steps)
,我们可以知道,随着当前的step
不断增加,decay_rate ^ (step / decay_steps)
是降低的。
接下来,我们直接带入具体的数据,来看一下这几个参数的具体作用。
如下图所示,我们这里有一个训练数据集,其中共有193608
个样本。
同时,我设置了神经网络的batch size
为2048
,那么基于前述提及的文章神经网络常见参数解释:epoch、batch、batch size、step、iteration,可知在1
个epoch
中,我们对这193608
个样本加以训练,共需要的batch
数目为193608 / 2048
,也就是94.54
,向上取整为95
,相当于需要95
个step
。此外,我设置initial_learning_rate
、decay_rate
以及decay_steps
分别为0.1
、0.95
以及95
,且设置staircase
为True
。如下图所示。
此时,我们就可以对每一个参数的具体含义与作用加以介绍了。首先,我们开始训练神经网络模型,即step
开始从0
逐步增加;但是由于我的staircase
为True
,因此只要指数(step / decay_steps)
是小于1
的,那么都视作0
(因为当前参数设置是对结果向下取整);而由于除了0
以外任何数的0
次方都是1
,因此此时的公式initial_learning_rate * decay_rate ^ (step / decay_steps)
始终等于initial_learning_rate
,也就是一直保持0.1
;只有当step
到达我们设置的decay_steps
之后,指数(step / decay_steps)
才可以成为1
,使得decay_rate
终于产生了效果。而在这里,由于我故意设置decay_steps
为95
,因此按道理只要经过1
个epoch
之后,学习率就会下降——因为前面我们计算过了,在1
个epoch
中需要95
个step
。那么此时,学习率就变为了0.1 * 0.95
。
接下来,我们运行上述代码,训练6
个epoch
,来验证一下学习率的变化是否如同我们的设想。
下图为TensorBoard
中,学习率随着epoch
的变化。这里需要注意,我这里截图的时候开了曲线图的平滑选项,因此应该以浅色的线为准。
上面的图因为不太全,所以或许看不出什么;我们直接将学习率变化情况导出,如下图所示。
其中,图中的step
实际上表示的是epoch
,大家这里理解即可。可以看到,在epoch
为0
时(也就是进行第一个epoch
时),学习率一直为0.1
;而进行到第二个epoch
时——此时我们训练过程的step
就应该是从95
开始,但还不到190
,因此(step / decay_steps)
始终为1
,学习率就是0.1 * 0.95 = 0.095
了(因为数据格式问题,精度稍有差距);随后,进行到第三个epoch
时——此时我们训练过程的step
就应该是从190
开始,但还不到285
,因此(step / decay_steps)
始终为2
,学习率就已经是0.1 * 0.95 * 0.95 = 0.09025
了。
由此可知,假如我将decay_steps
扩大10
倍,使得其为950
,那么在前10
个epoch
时,学习率都不会发生改变,而从第11
个epoch
开始,学习率才会开始衰减。
这里我的参数staircase
设置为True
,因此会出现上述结果;相反的,如果设置为False
,那么计算(step / decay_steps)
时,是对结果取小数,换句话说只要step
发生变化,那么当前对应的学习率也会发生变化,只不过变化的幅度会稍小一些。
由此看到,上述学习率的变化,是符合我们的预期的。当然,上图中最后两个epoch
对应的学习率没有发生变化,这个具体原因我暂时也没搞清楚;不过学习率下降作为一种策略,我们通过上述代码,还是达到了动态调整学习率的需求的。
至此,大功告成。
tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法的更多相关文章
- 【体系结构】Oracle参数介绍
[体系结构]Oracle参数介绍 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩ ...
- 【tensorflow】】模型优化(一)指数衰减学习率
指数衰减学习率是先使用较大的学习率来快速得到一个较优的解,然后随着迭代的继续,逐步减小学习率,使得模型在训练后期更加稳定.在训练神经网络时,需要设置学习率(learning rate)控制参数的更新速 ...
- Tensorflow笔记——神经网络图像识别(四)搭建模块化的神经网络八股(正则化,指数衰减学习率,滑动平均等优化)
实战案例: 数据X[x0,x1]为正太分布随机点, 标注Y_,当x0*x0+x1*x1<2时,y_=1(红),否则y_=0(蓝) 建立三个.py文件 1. generateds.py生成数据 ...
- TensorFlow笔记之常见七个参数
对TensorFlow深度学习中常见参数的总结分析 神经网络中常见的参数有:初始学习率.学习率衰减率.隐藏层节点数量.迭代轮数.正则化系数.滑动平均衰减率.批训练数量七个参数. 对这七个参数,大部分情 ...
- caffe中的学习率的衰减机制
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Julialove102123/article/details/79200158 根据 caffe/ ...
- TensorFlow tf.app&tf.app.flags用法介绍
TensorFlow tf.app&tf.app.flags用法介绍 TensorFlow tf.app argparse tf.app.flags 下面介绍 tf.app.flags.FL ...
- 【转载】 TensorFlow tf.app&tf.app.flags用法介绍
作 者:marsggbo 出 处:https://www.cnblogs.com/marsggbo版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本. ---------- ...
- SQLMAP参数介绍
转自:http://zhan.renren.com/bugpower?gid=3602888498044629629&checked=true SQLMAP参数介绍 sqlmap的使用方式:p ...
- G++ 参数介绍(转载)
g++参数介绍 From: http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html gcc and g++分别是gnu的c & ...
- pentaho cde 画图参数介绍
初步接触pentaho,由于在国内的资料很少,唯有看英文文档,做了N次反复尝试,挖掘了pentaho CDE中画图的一些基本参数. 下面就列出来了一些常用参数介绍: crosstabMode:表明如果 ...
随机推荐
- saltstack web 平台开发
运维平台参考: https://wrapbootstrap.com/
- 二分法(POJ-1064与POJ-2456)
二分查找,简而言之就是在一个有序的序列中找一个元素,因为这些元素已经有序,所以每次都将要找的数跟待寻找序列的中间元素比较,如果要找的数大于中间元素,说明接下来只需要在该序列的右半边中找,所以可以不用管 ...
- docker镜像仓库管理Harbor
一 部署Harbor 前提: Harbor需要运行在docker上面,所以首先需要在harbor部署机器上面自行部署docker和docker-compose docker-compose安装命令如下 ...
- 部署springboot+vue项目文档(若依ruoyi项目部署步骤)
摘自:https://blog.csdn.net/Dreamboy_w/article/details/104389797 部署springboot+vue项目文档(若依ruoyi项目部署步骤)一:部 ...
- python377和python27的区别?
python27无法解释print(1,2,3,sep="*"),Windows命令行窗口运行会报语法错误:无效语法 SyntaxError:invalid syntax pyt ...
- [NOIP2001 提高组] 数的划分
个人博客传送锚点:https://www.acwing.com/blog/content/55495/ 传送锚点:https://www.luogu.com.cn/problem/P1025 题目描述 ...
- Leetcode数组-二分法
Leetcode数组-二分法 二分法学习地址 二分法 704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 targe ...
- k8s网络问题以及容器跨宿主机通信原理
[0]资源配置文件 [root@mcwk8s03 mcwtest]# ls mcwdeploy.yaml [root@mcwk8s03 mcwtest]# cat mcwdeploy.yaml api ...
- NET8中增加的简单适用的DI扩展库Microsoft.Extensions.DependencyInjection.AutoActivation
这个库提供了在启动期间实例化已注册的单例,而不是在首次使用它时实例化. 单例通常在首次使用时创建,这可能会导致响应传入请求的延迟高于平时.在注册时创建实例有助于防止第一次Request请求的SLA 以 ...
- 什么是浅拷贝和深拷贝,如何用 js 代码实现?
〇.简介和对比 简介 浅拷贝:只复制原始对象的第一层属性值. 如果属性值是值类型,将直接复制值,本值和副本变更互不影响: 如果是引用数据类型,则复制内存地址,因此原始对象和新对象的属性指向相同 ...