【问题标题】:Potential bug in tensorflow CNN tutorial code using ExponentialMovingAverage?使用 ExponentialMovingAverage 的 tensorflow CNN 教程代码中的潜在错误?
【发布时间】:2018-04-09 06:43:52
【问题描述】:

我正在研究使用 cifar10 数据集训练 CNN 的 tensorflow 卷积神经网络教程的代码。源代码位于Gihub,文档位于Document

我的问题是关于在cifar10.py 375-378 行中使用ExponentialMovingAverage(doc here)。这是

with tf.control_dependencies([apply_gradient_op, variables_averages_op]):
    train_op = tf.no_op(name='train')
return train_op

这里,variables_averages_op 是一个更新所有影子变量的操作,apply_gradient_op 是一个将计算梯度应用于所有原始变量的操作(它更新原始变量,也就是模型权重)。

由于control_dependencies不保证其传递参数的执行顺序,所以apply_gradient_opvariables_averages_op的执行顺序在本例中是任意的,这进一步说明在运行train_op时,我们最终可能会首先更新原始变量,然后更新相应的影子变量,或者更新影子变量原始变量之前。后一种对我来说似乎不合理。

根据ExponentialMovingAverage的官方文档(上面的链接),shadow变量的更新依赖于原来的变量:

shadow_variable = decay * shadow_variable + (1 - decay) * variable

原变量的更新应该在影子变量的更新之前,教程代码中不是这样的。

谁能帮我解决这个问题?谢谢。

【问题讨论】:

    标签: python image-processing tensorflow convolutional-neural-network


    【解决方案1】:

    我相信你是对的。这似乎是示例中的一个错误。这在实践中可能并不重要,因为变量更新和移动平均更新的顺序可能是稳定的。即使是“错误”的订单,在最坏的情况下,你的移动平均线也会“领先变量一步”。与将衰减从 0.999 更改为 0.998 或类似的东西相比,这可能产生的影响较小。

    刚刚创建了一个拉取请求来解决这个问题:https://github.com/tensorflow/models/pull/3946

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-30
      • 2017-01-08
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      相关资源
      最近更新 更多