Keras新优化器中decay参数已弃用,如何替换实现相同效果?
解决Adam优化器
decay参数弃用问题 新版Keras/TensorFlow已经移除了Adam优化器的decay参数,要实现和原代码decay=INIT_LR / EPOCHS完全一致的学习率衰减效果,需要用学习率调度器替代,以下是具体实现方式:
核心逻辑说明
原decay参数的学习率更新公式为:
lr = INIT_LR / (1 + decay * 累计训练步数)
其中“累计训练步数”指的是训练过程中完成的batch数量(每跑一个batch算一步)。我们需要用自定义调度器复现这个计算逻辑。
代码修改方案
方案一:自定义学习率调度器(完美匹配原效果)
INIT_LR = 1e-3 EPOCHS = 10 BS = 8 # 定义匹配原decay逻辑的学习率调度器 def lr_schedule(step): decay = INIT_LR / EPOCHS # 和原代码的decay值完全一致 return INIT_LR / (1 + decay * step) # 初始化Adam优化器,传入调度器 opt = tf.keras.optimizers.Adam(learning_rate=lr_schedule) # 编译模型 model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"]) # 注意:新版Keras已弃用fit_generator,改用fit即可 R = model.fit( trainAug.flow(X_train, Y_train, batch_size=BS), steps_per_epoch=len(X_train) // BS, validation_data=(X_test, Y_test), validation_steps=len(X_test) // BS, epochs=EPOCHS )
方案二:用内置调度器实现近似线性衰减
如果不想自定义函数,也可以用PolynomialDecay实现线性衰减效果(和原decay逻辑略有差异,但趋势一致):
from tensorflow.keras.optimizers.schedules import PolynomialDecay INIT_LR = 1e-3 EPOCHS = 10 BS = 8 total_train_steps = EPOCHS * (len(X_train) // BS) # 初始化线性衰减调度器,训练结束时学习率降到0 lr_schedule = PolynomialDecay( initial_learning_rate=INIT_LR, decay_steps=total_train_steps, end_learning_rate=0.0, power=1.0 ) opt = tf.keras.optimizers.Adam(learning_rate=lr_schedule) # 后续编译、训练代码同上
额外提示
- 所有新版Keras优化器的学习率调整都需要通过
learning_rate参数传入调度器,不再支持单独的decay参数。 fit_generator已被官方标记为弃用,直接使用model.fit()即可,参数用法和之前完全一致。
内容的提问来源于stack exchange,提问作者9Tharaka
相关产品推荐
相关产品推荐

