在tensorflow中,有一个众所周知的批处理规范化,它将权重更新操作添加到tf.GraphKeys.UPDATE_OPS
。但是在实例规范化的情况下,不添加任何更新操作。使用tf.contrib.layer.batch_norm
时,我可以指定is_training
参数,该参数将update op添加到集合中。
但是对于tf.contrib.layer.instance_norm
和tf.contrib.layer.group_norm
来说,没有这样的参数,也没有将op添加到tf.GraphKeys.UPDATE_OPS
中。
这是正确的行为,还是张量流中的错误?实例规范化中的更新操作如何工作?
答案 0 :(得分:1)
您应该了解为什么batch_norm
需要在UPDATE_OPS
中添加操作。
tf.layers.batch_normalization
函数将生成四个变量,即gamma
,beta
,moving_mean
和moving_variance
,而只有gamma
,{{1 }}位于beta
中。
在训练阶段,tf.GraphKeys.TRAINABLE_VARIABLES
和moving_mean
也需要更新,因此如果我们将moving_variance
的{{1}}参数设置为1,则该函数会将相应的操作添加到training
中以更新tf.layers.batch_normalization
和tf.GraphKeys.UPDATE_OPS
,而如果我们将moving_mean
的{{1}}参数设置为0,则该函数将不会执行任何操作moving_variance
,因为它不需要在测试阶段更新training
和tf.layers.batch_normalization
。
对于tf.GraphKeys.UPDATE_OPS
和moving_mean
,它们仅具有moving_variance
中的group_norm
和instance_norm
变量,因此存在无需在beta
中添加任何操作。