0

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

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

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_op和的执行顺序variables_averages_op是任意的,这进一步表明,在运行 时train_op,我们最终可能会首先更新原始变量,然后更新对应的影子变量,或在原始变量之前更新影子变量。后一种对我来说似乎不合理。

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

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

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

谁能帮我清除一下?谢谢。

4

1 回答 1

0

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

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

于 2018-04-11T04:18:16.577 回答