4用于cifar10的卷积神经网络-4.25/4.26Tensorflow中的四种学习率衰减方法(上/下)_final learning rate-程序员宅基地

技术标签: TensorFlow中级教程  

TensorFlow中的可变学习率

1、exponential_decay指数式衰减:
这里写图片描述

这里写图片描述

功能:对输入学习率learning rate实现指数衰减。

当我们训练一个模型的时候,经常需要根据训练过程的进展来逐渐降低学习率。上面的函数把一个指数衰减函数应用到初始学习率上以达到在训练过程中不断减少学习率。它需要一个“global step”值来计算衰减以后的学习率。你可以传入一个TensorFlow variable,只要这个Variable在每个训练步都自增就可以啦。

更新公式:

  decayed_learning_rate = learning_rate *
                          decay_rate ^ (global_step / decay_steps)

如果参数‘staircase ’为true,那么‘global_step/decay_step’是一个整数除法,衰减后的学习率是一个阶梯状的函数。

示例代码:以0.1的初始学习率开始,每隔100000步衰减一下,衰减速率:0.96

  global_step = tf.Variable(0, trainable=False)
  starter_learning_rate = 0.1
  learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,
                                             100000, 0.96, staircase=True)
  # Passing global_step to minimize() will increment it at each step.
  learning_step = (
      tf.train.GradientDescentOptimizer(learning_rate)
      .minimize(...my loss..., global_step=global_step)
  )

参数:
learning_rate : 初始的learning rate
global_step : 全局的step,与 decay_step 和 decay_rate一起决定了 learning rate的变化。
staircase : 如果为 True global_step/decay_step 向下取整
decayed_learning_rate为每一轮优化时使用的学习率;
learning_rate为事先设定的初始学习率;
decay_rate为衰减系数;
decay_steps为衰减速度。

这里写图片描述


2、polynomial_decay多项式衰减:
这里写图片描述

这里写图片描述

功能:对输入学习率learning rate实施多项式衰减
大量的实验观察表明:通过精心的选择学习率的单调下降速率,可以获得一个性能更好地模型。这个函数使用一个多项式衰减函数使得学习率从指定的初始值(‘learning_rate’)经过指定的步数(‘decay_steps’)单调下降到指定的结束值(‘end_learning_rate’)

衰减以后的学习率是如下计算的:

python
  global_step = min(global_step, decay_steps)
  decayed_learning_rate = (learning_rate - end_learning_rate) *
                          (1 - global_step / decay_steps) ^ (power) +
                          end_learning_rate

示例代码:decay from 0.1 to 0.01 in 10000 steps using sqrt (i.e. power=0.5):

python
  ...
  global_step = tf.Variable(0, trainable=False)
  starter_learning_rate = 0.1
  end_learning_rate = 0.01
  decay_steps = 10000
  learning_rate = tf.train.polynomial_decay(starter_learning_rate, global_step,
                                            decay_steps, end_learning_rate,
                                            power=0.5)
  # Passing global_step to minimize() will increment it at each step.
  learning_step = (
      tf.train.GradientDescentOptimizer(learning_rate)
      .minimize(...my loss..., global_step=global_step)
  )

这里写图片描述


3、natural_exp_decay自然指数衰减:
这里写图片描述

这里写图片描述

衰减以后的学习率是如下计算的:

decayed_learning_rate = learning_rate * exp(-decay_rate * global_step)

示例代码: decay exponentially with a base of 0.96:

  global_step = tf.Variable(0, trainable=False)
  learning_rate = 0.1
  k = 0.5
  learning_rate = tf.train.exponential_time_decay(learning_rate, global_step, k)

  # Passing global_step to minimize() will increment it at each step.
  learning_step = (
      tf.train.GradientDescentOptimizer(learning_rate)
      .minimize(...my loss..., global_step=global_step)
  )

这里写图片描述


4、inverse_time_decay逆时间衰减:
这里写图片描述

这里写图片描述

衰减以后的学习率是如下计算的:

decayed_learning_rate = learning_rate / (1 + decay_rate * t)

示例代码: decay 1/t with a rate of 0.5:

global_step = tf.Variable(0, trainable=False)
  learning_rate = 0.1
  k = 0.5
  learning_rate = tf.train.inverse_time_decay(learning_rate, global_step, k)

  # Passing global_step to minimize() will increment it at each step.
  learning_step = (
      tf.train.GradientDescentOptimizer(learning_rate)
      .minimize(...my loss..., global_step=global_step)
  )

这里写图片描述


代码如下:

#-*- coding:utf-8 -*-
#实现简单卷积神经网络对MNIST数据集进行分类:conv2d + activation + pool + fc
import csv
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import sys
from six.moves import urllib
import tarfile
import cifar10_input
import numpy as np

# 设置算法超参数
training_epochs = 5
num_examples_per_epoch_for_train = 10000
batch_size = 100
learning_rate_init = 0.1
learning_rate_final = 0.001
learning_rate_decay_rate = 0.7
# learning_rate_decay_rate = 0.5
num_batches_per_epoch = int(num_examples_per_epoch_for_train/batch_size)
num_epochs_per_decay = 1 #Epochs after which learning rate decays
learning_rate_decay_steps = int(num_batches_per_epoch * num_epochs_per_decay)

display_step = 50
conv1_kernel_num = 32
conv2_kernel_num = 32
fc1_units_num = 250
fc2_units_num = 150
activation_func = tf.nn.relu
activation_name = 'relu'
l2loss_ratio = 0.05

with tf.Graph().as_default():
    #优化器调用次数计算器,全局训练步数
    global_step = tf.Variable(0,name='global_step',trainable=False,dtype=tf.int64)

    #使用exponential_decay产生指衰减的学习率
    learning_rate = tf.train.exponential_decay(learning_rate_init,
                                               global_step,
                                               learning_rate_decay_steps,
                                               learning_rate_decay_rate,
                                               staircase=False)

    #使用polynomial_decay产生多项式衰减的学习率
    # learning_rate = tf.train.polynomial_decay(learning_rate_init,
    #                                             global_step,
    #                                             learning_rate_decay_steps,
    #                                             learning_rate_decay_rate,
    #                                             staircase=False)

    # 使用natural_exp_decay产生自然指数衰减的学习率
    # learning_rate = tf.train.natural_exp_decay(learning_rate_init,
    #                                           global_step,
    #                                           learning_rate_decay_steps,
    #                                           learning_rate_decay_rate,
    #                                           staircase=False)

    # 使用inverse_time_decay产生逆时间衰减的学习率
    # learning_rate = tf.train.inverse_time_decay(learning_rate_init,
    #                                            global_step,
    #                                            learning_rate_decay_steps,
    #                                            learning_rate_decay_rate,
    #                                            staircase=False)

    #定义损失函数
    weights = tf.Variable(tf.random_normal([9000,9000],mean=0.0,stddev=1e9,dtype=tf.float32))
    myloss = tf.nn.l2_loss(weights,name="L2Loss")

    #传入 learning_rate创建优化器对象
    optimizer = tf.train.GradientDescentOptimizer(learning_rate)
    #将global_step传入minimize(),每次调用minimize都会使得global_step自增1.
    training_op = optimizer.minimize(myloss,global_step=global_step)

    #添加所有变量的初始化节点
    init_op = tf.global_variables_initializer()

    #将评估结果保存到文件
    results_list = list()
    results_list.append(['train_step','learning_rate','train_step','train_loss'])

    #启动会话,训练模型
    with tf.Session() as sess:
        sess.run(init_op)
        #训练指定轮数,每一轮的训练样本总数为:num_examples_per_epoch_for_train
        for epoch in range(training_epochs):
            print('********************************************')
            #每一轮都要把所有的batch跑一遍
            for batch_idx in range(num_batches_per_epoch):
                #获取learning_rate的值
                current_learning_rate = sess.run(learning_rate)
                #执行训练节点,获取损失节点和global_step的值
                _,loss_value,training_step = sess.run([training_op,myloss,global_step])

                print("Training Epoch:" + str(epoch) +
                      ",Training Step:" + str(training_step)+
                      ",Learning Rate = " + "{:.6f}".format(current_learning_rate) +
                      ",Learning Loss = " + "{:.6f}".format(loss_value))
                #记录结果
                results_list.append([training_step,current_learning_rate,training_step,loss_value])

    #将评估结果保存到文件
    print("训练结束,将结果保存到文件")
    results_file = open('evaluate_results/learning_rate/exponential_decay/evaluate_results(decay_rate=0.7,staircase=False).csv','w',newline='')
    csv_writer = csv.writer(results_file,dialect='excel')
    for row in results_list:
        csv_writer.writerow(row)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hongxue8888/article/details/78652602

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签