我有一个客户估算器,该估算器具有几层,类似于模型函数中的以下层:
natural_layer = tf.layers.dense(inputs = natural_layer,
units = units,
activation = None,
use_bias = False,
kernel_regularizer = params['regularizer'],
name = 'pre_batch_norm_layer_' + str(i + 1))
natural_layer = tf.layers.batch_normalization(natural_layer,
axis = 1,
center = True,
scale = True,
training = (mode == tf.estimator.ModeKeys.TRAIN),
name = 'batch_norm_layer_' + str(i + 1))
natural_layer = params['natural_layer_activation'](natural_layer, name = 'activation_layer_' + str(i + 1))
由于我使用的是批处理规范,因此训练操作的设置如下:
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
optimizer = tf.contrib.opt.MultitaskOptimizerWrapper(params['optimization_algorithm'](params['training_rate']))
train_op = optimizer.minimize(loss, global_step = tf.train.get_global_step())
优化器通常是tf.train.AdamOptimizer。
但是,当我去训练估计量时,全局步长永远不会增加(所以训练将永远进行),我得到了:
警告:tensorflow:似乎全局步长(tf.train.get_global_step)尚未增加。当前值(可能是稳定值):0与先前值:0。您可以通过将tf.train.get_global_step()传递给Optimizer.apply_gradients或Optimizer.minimize来增加全局步长。
我正在传递tf.train.get_global_step()以最小化,所以我不确定为什么它永远不会更新。我的直觉是它与批处理规范化有关,因为当我删除它或将其替换为dropout时,一切都很好(即使保留了根据文档进行批处理规范化所需的更新操作行)。
有人知道发生了什么吗?如果有帮助,很乐意发布更多代码。
答案 0 :(得分:1)
即使没有批标准化,我也会遇到同样的问题。据我所知,我可以通过与update_ops
子句一起在sess.run
中与train_ops
一起调用tf.control_dependencies
来解决这个问题。这可能只是张量流的一个错误。
答案 1 :(得分:0)
我不知道为什么全局步长没有自动增加,但是通过使用tf.group将全局步长添加到train_op中,如下手动增加全局步长是一个很好的解决方法。
@Autowired