【问题标题】:Global step not incrementing with batch norm and custom estimator全局步骤不随批量规范和自定义估计器增加
【发布时间】:2018-10-24 19:29:33
【问题描述】:

我有一个客户估算器,它在模型函数中有几个层,如下所示:

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))

因为我使用的是batch norm,所以训练操作是这样设置的:

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。

但是,当我去训练估计器时,全局步骤永远不会增加(因此训练将永远运行),我得到了这个:

WARNING:tensorflow:似乎全局步长(tf.train.get_global_step)没有增加。当前值(可能是稳定的):0 vs 之前的值:0。您可以通过将 tf.train.get_global_step() 传递给 Optimizer.apply_gradients 或 Optimizer.minimize 来增加全局步长。

我正在传递 tf.train.get_global_step() 以最小化,所以我不确定为什么它永远不会更新。我的预感是它与批量规范化有关,因为当我删除它或将其替换为 dropout 时,一切正常(即使根据文档保留批量规范化所需的更新操作行)。

有人知道怎么回事吗?如果有帮助,很高兴发布更多代码。

【问题讨论】:

    标签: python tensorflow batch-normalization


    【解决方案1】:

    我无法弄清楚为什么全局步骤没有自动增加,但是通过将全局步骤添加到带有 tf.group 的 train_op 来手动增加全局步骤如下是一个不错的解决方法。

    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()
            update_global_step = tf.assign(global_step, global_step + 1, name = 'update_global_step')
    
            return tf.estimator.EstimatorSpec(mode, loss = loss, train_op = tf.group(train_op, update_global_step))
    

    【讨论】:

      【解决方案2】:

      即使没有批量标准化,我也​​会遇到同样的问题。据我记得,我可以通过在sess.runtrain_ops 中调用update_ops 来绕过它,而不是在tf.control_dependencies 子句中。这可能只是 tensorflow 的一个错误。

      【讨论】:

      • 这似乎并不能完全解决问题,但是在定义操作并将其添加到tf.cond 中的集合时会出现一个可疑的类似问题。事实上,这个错误似乎关闭了 any 的 update_ops 集合的运行。 take a look 可能会很有趣。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多