TensorFlow学习率衰减global_step作用及ValueError报错解决方案咨询
1、global_step到底是什么?
global_step是TensorFlow中用于记录模型训练总批次步数的全局计数器变量,每完成一个batch的参数更新,该变量自动加1。你之前触发ValueError: None values not supported.的原因是:tf.compat.v1.train.get_global_step()在Estimator训练上下文外部调用时,全局变量还未初始化,返回值为None,传入学习率衰减函数后触发报错。
2、该参数对模型效果提升是否至关重要?
是。学习率衰减的计算逻辑完全依赖训练步数匹配对应的学习率取值,学习率的变化节奏直接影响模型收敛效果:如果学习率下降过快,模型会提前欠拟合;下降过慢则会在最优值附近震荡无法收敛到更高精度。你之前使用keras版ExponentialDecay效果差,几乎都是因为参数没有和原教程对齐,比如漏设staircase=True、decay_steps取值和原教程的checkpoint_steps不一致,导致学习率变化节奏和原实现不匹配。
3、如果必须使用该参数,我要如何调整代码才能正常运行?
提供两种可直接复现原教程效果的写法:
方案1:沿用原教程的v1版衰减接口,修改优化器传入方式
不要在全局作用域定义学习率调度器,而是将优化器的生成逻辑封装为函数传入Estimator,Estimator内部运行时会自动初始化global_step变量,不会再返回None:
# 定义优化器生成函数 def create_proximal_adagrad(): initial_lr = 0.096505 learning_decay_rate = 0.7 lr_schedule = tf.compat.v1.train.exponential_decay( learning_rate = initial_lr, global_step = tf.compat.v1.train.get_global_step(), decay_steps = checkpoint_steps, decay_rate = learning_decay_rate, staircase = True ) return tfa.optimizers.ProximalAdagrad( learning_rate = lr_schedule, l1_regularization_strength = 0.0026019, l2_regularization_strength = 0.0107146 ) # 定义Estimator时直接传入函数即可,不需要调用 estimator = tf.estimator.DNNRegressor( feature_columns = dnn_features, hidden_units = [128, 64, 32, 16], config = tf.estimator.RunConfig( save_checkpoints_steps = checkpoint_steps ), model_dir = model_dir, batch_norm = True, dropout = 0.843251, optimizer = create_proximal_adagrad ) tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
方案2:使用keras版ExponentialDecay,对齐所有参数
keras版调度器会自动跟踪训练步数,不需要手动传入global_step,只要严格对齐原教程的衰减参数就能得到一致效果:
initial_lr = 0.096505 learning_decay_rate = 0.7 # 所有参数和原教程完全对齐 lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay( initial_learning_rate = initial_lr, decay_steps = checkpoint_steps, decay_rate = learning_decay_rate, staircase = True ) estimator = tf.estimator.DNNRegressor( feature_columns = dnn_features, hidden_units = [128, 64, 32, 16], config = tf.estimator.RunConfig( save_checkpoints_steps = checkpoint_steps ), model_dir = model_dir, batch_norm = True, dropout = 0.843251, optimizer = tfa.optimizers.ProximalAdagrad( learning_rate = lr_schedule, l1_regularization_strength = 0.0026019, l2_regularization_strength = 0.0107146 ) ) tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
内容的提问来源于stack exchange,提问作者timmy
相关产品推荐
相关产品推荐

