我正在研究使用 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
原始变量的更新应该在影子变量的更新之前,教程代码中不是这种情况。
谁能帮我清除一下?谢谢。