我正在研究张量流卷积神经网络教程的代码,该教程使用cifar10数据集训练CNN。源代码位于Gihub和Document中的文档中。
我的问题是关于在ExponentialMovingAverage
第375-378行使用cifar10.py
(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
是将计算渐变应用于所有原始变量(更新原始变量,即模型权重)的操作。 / p>
由于control_dependencies
并不保证其传递参数的执行顺序,因此apply_gradient_op
和variables_averages_op
的执行顺序在此示例中是任意的,这进一步表明在运行train_op
时,我们最终可能会首先更新原始变量,然后更新相应的阴影变量,或更新阴影变量之前原始变量。后者对我来说似乎不合理。
根据ExponentialMovingAverage
的官方文档(上面的链接),影子变量的更新依赖于原始变量:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
原始变量的更新应该在更新阴影之前进行,而在教程代码中并非如此。
任何人都可以帮我清楚吗?感谢。
答案 0 :(得分:0)
我相信你是对的。它看起来像是一个例子中的错误。它在实践中可能并不重要,因为变量更新和移动平均更新的顺序可能是稳定的。即使它是"错误"在最糟糕的情况下,您的移动平均线将比变量"领先一步。这可能比将您的衰变从Application
更改为0.999
之类的效果不那么显着。
刚刚创建了一个解决此问题的拉取请求:https://github.com/tensorflow/models/pull/3946