Machine learning 为什么tf.contrib.layers.convolution2d不需要显式更新移动平均值和移动方差?

Machine learning 为什么tf.contrib.layers.convolution2d不需要显式更新移动平均值和移动方差?,machine-learning,tensorflow,deep-learning,Machine Learning,Tensorflow,Deep Learning,tf.contrib.layers.convolution2d层如何不要求用户显式更新移动统计信息 我问这个问题的原因是因为我最近问过如何使用tf.contrib.layers.batch\u norm,而不必显式地更新移动统计信息 但是,我注意到,有一个不同的层允许您提供规范化层(比如normalizer\u fn=tf.contrib.layers.batch\u norm),但是不需要显式更新移动统计数据(如我在另一个问题中详细介绍的)。那黑魔法是怎么发生的?i、 e.卷积2D如何能够跳过

tf.contrib.layers.convolution2d
层如何不要求用户显式更新移动统计信息

我问这个问题的原因是因为我最近问过如何使用
tf.contrib.layers.batch\u norm
,而不必显式地更新移动统计信息

但是,我注意到,有一个不同的层允许您提供规范化层(比如
normalizer\u fn=tf.contrib.layers.batch\u norm
),但是不需要显式更新移动统计数据(如我在另一个问题中详细介绍的)。那黑魔法是怎么发生的?i、 e.卷积2D如何能够跳过(似乎)不可避免的要求


理想情况下,我希望创建一个类似的API/接口,这样我就不需要显式地更新移动统计数据,也不需要像这个convolution2d层那样干净地工作。

tf.contrib.layers.convolution2d
不知道或做任何有关批标准化或其统计数据的特殊事情。如果您查看实现,它所做的就是应用您选择的规范化器函数。发件人:

所以卷积层实际上与你的问题无关。与此相关的只是批量规范化的实现。关于你问题的其余部分,请参见我的回答:


希望有帮助

我确实读了你的另一个答案,但我仍然感到困惑。即使构建了不同的图形,也必须在某个时刻告诉软件,即使手动操作是否应该应用批处理规范化(BN)。这是否意味着
tf.contrib.layers.convolution2d
会出错,并且总是在推理模式下应用它?除非他们明确地编写了它,否则我很肯定人们需要逻辑
z=tf.cond(train_phase,lambda:bn_train,lambda:bn_expression)
才能使批处理规范化(bn)正常工作。所以你的回答让我觉得
tf.contrib.layers.coulsion2d
有缺陷。卷积层无条件地应用规范化。然而,批处理规范化的行为在训练和推理模式上有所不同。对不起,我将是超级直接的。实现是否错误?我想这是我没有得到的部分,它如何知道我的模型是处于训练模式还是处于推理模式?这是因为正如你在另一个答案中暗示的那样,训练和推理的模型通常是分开的,所以人们只是硬编码这个变量为真还是假?但人们似乎仍然需要
tf.cond
。对不起,我只是不知道如何忽略那个细节。要么他们写了那部分代码,要么我认为代码不正确,我猜。卷积层不知道。它无条件地应用规范化。但是,如果该规范化是批处理规范化,那么它会根据在Python中构建层时传递的
is\u training
参数的值执行不同的操作。有两种方法可以传递
is\u training
参数——要么作为显式Python参数,要么通过参数作用域机制。决策是在图形构建时做出的,而不是在运行时(在这种情况下,您需要
tf.cond
)。
if normalizer_fn is not None:
  normalizer_params = normalizer_params or {}
  outputs = normalizer_fn(outputs, **normalizer_params)