说下自己的理解吧。
我认为两者是独立的。理由如下:
- tf.train.ExponentialMovingAverage做为一个滑动平均类,其在对变量施加滑动平均操作的时候是会维持一个影子变量来记录其对应变量的滑动平均值。并且滑动平均过程,不会改变变量本身的值。
- 由于滑动平均过程并不会改变变量本身的值,因此认为变量权重更新的过程与滑动平均过程是互相不干扰的。
- 从代码训练的角度来说,施加滑动平均类的tf代码中,要保证训练神经网络过程中,既要根据反向传播更新参数又要更新每一个滑动平均值。因此认为其更新顺序,是更新后的变量,再做滑动平均。如下代码:
with tf.control_dependencies([train_step,variable_average_op]): train_op = tf.no_op(name="train")
以上是个人理解,仅仅从ema原理和代码训练角度猜测了下,具体没有看过源码,不敢随意下结论。仅供参考吧~