全局步骤不随着批处理规范和自定义估算器而增加

时间:2018-10-24 19:29:33

标签: python tensorflow batch-normalization

我有一个客户估算器,该估算器具有几层,类似于模型函数中的以下层:

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时,一切都很好(即使保留了根据文档进行批处理规范化所需的更新操作行)。

有人知道发生了什么吗?如果有帮助,很乐意发布更多代码。

2 个答案:

答案 0 :(得分:1)

即使没有批标准化,我也​​会遇到同样的问题。据我所知,我可以通过与update_ops子句一起在sess.run中与train_ops一起调用tf.control_dependencies来解决这个问题。这可能只是张量流的一个错误。

答案 1 :(得分:0)

我不知道为什么全局步长没有自动增加,但是通过使用tf.group将全局步长添加到train_op中,如下手动增加全局步长是一个很好的解决方法。

@Autowired