使用ExponentialMovingAverage的tensorflow CNN教程代码中的潜在错误?

时间:2018-04-09 06:43:53

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

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

我的问题是关于在ExponentialMovingAverage第375-378行使用cifar10.pydoc 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是将计算渐变应用于所有原始变量(更新原始变量,即模型权重)的操作。 / p>

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

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

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

原始变量的更新应该在更新阴影之前进行,而在教程代码中并非如此。

任何人都可以帮我清楚吗?感谢。

1 个答案:

答案 0 :(得分:0)

我相信你是对的。它看起来像是一个例子中的错误。它在实践中可能并不重要,因为变量更新和移动平均更新的顺序可能是稳定的。即使它是"错误"在最糟糕的情况下,您的移动平均线将比变量"领先一步。这可能比将您的衰变从Application更改为0.999之类的效果不那么显着。

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