tensorflow关于学习率的更新函数

经常你会看到在代码中出现随着迭代步数的增加学习速率降低的步骤,这是因为越到收敛点学习速率越快的话可能会导致越过收敛点,导致发散的情况。

下面我将介绍两种学习速率的降低函数:

一、tf.train.exponential_decay()

函数原型:

tf.train.exponential_decay(
    learning_rate,
    global_step,
    decay_steps,
    decay_rate,
    staircase=False,
    name=None
)

learning_rate:一个整数,类型为float32,float64张量,或者是一个Python数字,初始化的学习速率

global_step:一个整数,类型为int32,int64张量,或者是一个Python数字。不能为负数

decay_steps:一个整数,类型为float32,float64张量或者是一个python数字,衰减速率。

staircase:布尔型,如果为True,不连续的区间进行学习率的衰减

name:操作的名字,可选,默认的是'ExponentialDecay'.

这个函数应用一个指数衰减在最初的学习速率上,需要global_step这个参数来计算衰减的学习率。你需要传递一个tensorflow的变量来在每一个训练步骤上进行增加。函数返回的是衰减的学习率。

计算公式:

decayed_learning_rate = learning_rate *
                        decay_rate ^ (global_step / decay_steps)

如果参数staircase是True,那么global_step/decay_steps是一个整数除,通俗的说就是每decay_steps才更新一次参数。

官网的例子:每一步都衰减,初始学习速率是0.1,

...
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)
)

代码:参考的是博客:https://blog.youkuaiyun.com/wuguangbin1230/article/details/77658229

import tensorflow as tf
from tensorflow.python.ops import math_ops,array_ops
import numpy as np
import matplotlib.pyplot as plt

learning_rate = 0.1  
decay_rate = 0.96  
global_steps = 5000  
decay_steps = 100  
      
global_ = tf.Variable(tf.constant(0))  
c = tf.train.exponential_decay(learning_rate, global_, decay_steps, decay_rate, staircase=True)  
d = tf.train.exponential_decay(learning_rate, global_, decay_steps, decay_rate, staircase=False)  
     
T_C = []  
F_D = []  
      
with tf.Session() as sess:  
    for i in range(global_steps):  
        T_c = sess.run(c,feed_dict={global_: i})  
        T_C.append(T_c)  
        F_d = sess.run(d,feed_dict={global_: i})  
        F_D.append(F_d)  
      
      
plt.figure(1)  
plt.plot(range(global_steps), F_D, 'r-')  
plt.plot(range(global_steps), T_C, 'b-')  
          
plt.show()  

结果:可以发现红色的试试staircase=False的情况,你会看到学习率每一步都在降低,staircase为True的情况,你会发现每隔100步衰减一次,你可以将global_step设置为1000看看结果!

二、tf.train.piecewise_constant()

函数原型:

tf.train.piecewise_constant(
    x,
    boundaries,
    values,
    name=None
)

官网的例子:在开始的100001步学习率为1.0,接下来的10000步学习率为0.5,之后的步骤全部为0.1.

global_step = tf.Variable(0, trainable=False)
boundaries = [100000, 110000]
values = [1.0, 0.5, 0.1]
learning_rate = tf.train.piecewise_constant(global_step, boundaries, values)

# Later, whenever we perform an optimization step, we increment global_step.

参数:

x:一个0-D的整数张量,必须是下面的类型之一,float32,float64,uint8,int8,int16,int32,int64.

boundaries:一个张量的列表或者严格递增的int或者float组成的列表,当然了所有的元素的类型都必须跟x相同。

values:一个张量的列表,或者是float或者int组成的列表,指定由boundaries定义的区间的学习率。应该比boundaried元素多一个,且没个元素都有相同的类型。

name:可选的,操作的名字,默认为'PiecewiseConstant'.

返回:

一个0-D的张量;当x <= boundaries[0],学习率为values[0];当x > boundaries[0]x <= boundaries[1],学习率为values[1] ..., 当 x > boundaries[-1],学习率是values[-1].

代码:

import tensorflow as tf
from tensorflow.python.ops import math_ops,array_ops
import numpy as np
import matplotlib.pyplot as plt

global_ = tf.Variable(0, trainable=False)
boundaries = [100000, 110000]
values = [1.0, 0.5, 0.1]
global_step=120000
learning_rate = tf.train.piecewise_constant(global_, boundaries, values)
     
res=[]
      
with tf.Session() as sess:  
    for i in range(global_step):  
        result = sess.run(learning_rate,feed_dict={global_: i})  
        res.append(result)
      
plt.figure(1)  
plt.plot(range(global_step), res, 'r-')  

plt.show()  

结果;

 

 

### TensorFlow 2.7 学习率衰减函数及其使用方法 在 TensorFlow 2.7 中,可以通过多种方式实现学习率的动态调整。这些方法通常基于优化器中的 `tf.keras.optimizers.schedules` 模块来定义学习率的变化规律。 #### 多项式衰减 TensorFlow 提供了 `PolynomialDecay` 方法用于实现多项式形式的学习率衰减。该方法允许用户设置初始学习率 (`initial_learning_rate`) 和最终目标学习率 (`end_learning_rate`),并通过指定的步数 (`decay_steps`) 来控制衰减速率[^2]。 以下是具体代码示例: ```python import tensorflow as tf # 定义多项式衰减策略 lr_schedule = tf.keras.optimizers.schedules.PolynomialDecay( initial_learning_rate=0.1, # 初始学习率 decay_steps=10000, # 衰减总步数 end_learning_rate=0.001 # 最终学习率 ) # 创建优化器并应用学习率调度器 optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule) ``` 上述代码展示了如何利用 `PolynomialDecay` 实现从 0.1 开始逐步下降到 0.001 的学习率变化过程[^3]。 #### 指数衰减 除了多项式衰减外,还可以采用指数衰减的方式降低学习率。这种方式会在每次迭代后按比例缩小当前学习率。例如,在每轮训练结束后将现有学习率乘以一个小于 1 的因子 (e.g., 0.9)[^4]。 下面是一个简单的实现方案: ```python # 定义指数衰减策略 lr_schedule = tf.keras.experimental.CosineDecayRestarts( initial_learning_rate=0.1, first_decay_steps=1000, t_mul=2.0, m_mul=0.9, alpha=0.0 ) # 配置 Adam 优化算法 optimizer = tf.keras.optimizers.SGD(learning_rate=lr_schedule) ``` 这里采用了余弦退火重启动机制作为替代选项之一;它能够有效缓解传统单调递减模式可能带来的过拟合风险等问题。 综上所述,在实际项目开发过程中可以根据具体情况灵活选用不同类型的自适应调节技术来提升模型性能表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值