大家好,又见面了,我是你们的朋友全栈君。
学习率
学习率属于超参数。学习率决定梯度下降速度的快慢,学习率越大,速度越快;学习率越小,速度越慢。如果学习率过大,很可能会越过最优值;反而如果学习率过小,优化的效率可能过低,长时间算法无法收敛。所以学习率对于算法性能的表现至关重要。
指数衰减学习率
指数衰减学习率是在学习率的基础上增加了动态变化的机制,会随着梯度下降变化而动态变化
tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)
- learn_rate:事先设定的初始学习率
- global_step:训练轮数
- decay_steps:衰减速度。staircase=True:代表了完整的使用一遍训练数据所需要的迭代轮数(=总训练样本数/每个batch中的训练样本数)
- decay_rate:衰减系数
- staircase:默认为
False
,此时学习率随迭代轮数的变化是连续的(指数函数);为True
时,global_step/decay_steps
会转化为整数,此时学习率便是阶梯函数
步骤:
- 首先使用较大学习率(目的:为快速得到一个比较优的解);
- 然后通过迭代逐步减小学习率(目的:为使模型在训练后期更加稳定);
模板:
global_step = tf.Variable(0)
learning_rate = tf.train.exponential_decay(0.1, global_step, 1, 0.96, staircase=True) #生成学习率
learning_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(....., global_step=global_step) #使用指数衰减学习率
实例代码:
TRAINING_STEPS = 100
global_step = tf.Variable(0)
LEARNING_RATE = tf.train.exponential_decay(
0.1, global_step, 1, 0.96, staircase=True)
x = tf.Variable(tf.constant(5, dtype=tf.float32), name="x")
y = tf.square(x)
train_op = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(
y, global_step=global_step)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(TRAINING_STEPS):
sess.run(train_op)
if i % 10 == 0:
LEARNING_RATE_value = sess.run(LEARNING_RATE)
x_value = sess.run(x)
print("After %s iteration(s): x%s is %f, learning rate is %f." %
(i + 1, i + 1, x_value, LEARNING_RATE_value))
关于global_step的探究:
- global_step – 用于衰减计算的全局步骤。 一定不为负数。
- 喂入一次 BACTH_SIZE 计为一次 global_step
- 每间隔decay_steps次更新一次learning_rate值
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137629.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...