码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法


    本文介绍在tensorflow库中,用于动态调整神经网络的学习率的一种方法——指数衰减ExponentialDecay()策略的参数含义及其具体用法~
    合集 - 机器学习深度学习(16)
    1.Python TensorFlow深度学习回归代码:DNNRegressor2023-02-022.Python TensorFlow深度神经网络回归:keras.Sequential2023-02-033.Python实现随机森林RF并对比自变量的重要性2023-02-164.Python实现类别变量的独热编码(One-hot Encoding)2023-02-155.MATLAB人工神经网络ANN代码2023-02-096.MATLAB实现随机森林(RF)回归与自变量影响程度分析2023-02-067.Python绘制神经网络模型图2023-02-208.随机森林RF模型超参数的优化:Python实现2023-02-179.无需代码绘制人工神经网络ANN模型结构图的方法2023-05-1010.机器学习数据顺序随机打乱:Python实现2023-05-2211.神经网络常见参数解释:epoch、batch、batch size、step、iteration05-3012.SMOGN算法Python实现:解决回归分析中的数据不平衡06-0313.MATLAB神经网络工具箱使用介绍06-2014.SMOTE与SMOGN算法R语言代码07-15
    15.tensorflow学习率指数衰减ExponentialDecay的参数介绍与使用方法07-17
    16.部署CPU与GPU通用的tensorflow:Anaconda环境08-06
    收起

      本文介绍在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个样本。

    image

      同时,我设置了神经网络的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对应的学习率没有发生变化,这个具体原因我暂时也没搞清楚;不过学习率下降作为一种策略,我们通过上述代码,还是达到了动态调整学习率的需求的。

      至此,大功告成。

  • 相关阅读:
    Less is more VS 精一 [生活感悟]
    基于Java的智能停车场管理系统设计与实现(源码+lw+部署文档+讲解等)
    ORB(Oriented FAST and Rotated BRIEF)
    智能家居的智能升级
    IM即时通讯开发优化提升连接成功率、速度等
    SpringMVC 01: SpringMVC + 第一个SpringMVC项目
    小白快速自建博客--halo博客
    读书笔记:Effective C++ 2.0 版,条款43(多继承)、条款44(概念明确)、条款45-50(杂项)
    [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
    使用 Abp.Zero 搭建第三方登录模块(三):网页端开发
  • 原文地址:https://www.cnblogs.com/fkxxgis/p/18307747
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号