【发布时间】: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_op和variables_averages_op的执行顺序在本例中是任意的,这进一步说明在运行train_op时,我们最终可能会首先更新原始变量,然后更新相应的影子变量,或者更新影子变量在原始变量之前。后一种对我来说似乎不合理。
根据ExponentialMovingAverage的官方文档(上面的链接),shadow变量的更新依赖于原来的变量:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
原变量的更新应该在影子变量的更新之前,教程代码中不是这样的。
谁能帮我解决这个问题?谢谢。
【问题讨论】:
标签: python image-processing tensorflow convolutional-neural-network