在 tensorflow 中,有一个众所周知的批量归一化,它将权重更新操作添加到tf.GraphKeys.UPDATE_OPS。但是在实例规范化的情况下,没有添加更新操作。使用时tf.contrib.layer.batch_norm,我可以指定is_training将更新操作添加到集合的参数。但是 for tf.contrib.layer.instance_normandtf.contrib.layer.group_norm没有这样的参数,也没有添加 op 到tf.GraphKeys.UPDATE_OPS.
这是正确的行为,还是 tensorflow 中的错误?那么实例标准化中的更新操作如何工作?
你应该明白为什么batch_norm需要在UPDATE_OPS.
tf.layers.batch_normalization函数将生成四个变量,分别gamma是beta,moving_mean和moving_variance,并且只有gamma,beta都在tf.GraphKeys.TRAINABLE_VARIABLES。
当它在训练阶段,moving_mean并且moving_variance也需要更新,所以,如果我们设定的training参数为1 tf.layers.batch_normalization,函数就会将相应的OPS成tf.GraphKeys.UPDATE_OPS用于更新moving_mean和moving_variance,而如果我们设置training参数为0 tf.layers.batch_normalization,该功能不会做任何东西tf.GraphKeys.UPDATE_OPS,因为它不需要更新moving_mean并且moving_variance处于测试阶段。
至于group_normand instance_norm,它们只有betaandgamma变量,它们已经tf.GraphKeys.TRAINABLE_VARIABLES在tf.GraphKeys.UPDATE_OPS.