如何在TensorFlow中使用AdamOptimizer且禁用内置学习率衰减?
解决TensorFlow Adam优化器固定学习率的问题
没问题,你完全不需要重新编写一个全新的Optimizer就能实现需求!下面给你两种实用的方案,根据你的场景选择就行:
方案一:自定义学习率抵消Adam的内置修正
TensorFlow的Adam确实会自动用 lr = lr_t * sqrt(1 - beta2_power) / (1 - beta1_power) 这个公式调整学习率,如果你想手动控制最终使用的学习率,可以反过来计算传入优化器的初始学习率,抵消掉这个内置修正。
举个例子,假设你想要手动设置的目标学习率是 my_target_lr,那么你可以把传入Adam的学习率设为:
adjusted_lr = my_target_lr * (1 - optimizer.beta1_power) / tf.math.sqrt(1 - optimizer.beta2_power)
然后在每次迭代前更新优化器的学习率:
optimizer.learning_rate.assign(adjusted_lr)
这样优化器内部计算后,最终使用的学习率就会刚好是你手动设置的my_target_lr,不会被内置的修正项改变。
方案二:继承Adam重写学习率计算逻辑
如果觉得上面的抵消方法有点绕,你可以直接继承TensorFlow的Adam优化器,重写计算学习率的部分,去掉那个自动修正的逻辑。
代码示例大概是这样:
import tensorflow as tf from tensorflow.keras.optimizers import Adam class FixedLRAdam(Adam): def _get_lr(self, var_device, var_dtype, apply_state): # 直接返回当前设置的学习率,去掉内置的修正项 lr_t = tf.identity(self.lr, name="lr_t") return lr_t
这样你使用FixedLRAdam的时候,优化器就只会用你传入的学习率,不会自动乘以那个beta相关的修正因子,完全由你手动控制学习率的调整。
额外说明
如果你只是想自己手动做学习率衰减(比如阶梯衰减、余弦衰减),同时不想让Adam的内置修正干扰,更推荐用方案二,逻辑更清晰,不容易出错。方案一适合临时快速调整,不需要修改优化器类的场景。
内容的提问来源于stack exchange,提问作者Khoi Tran
相关产品推荐
相关产品推荐

