81

我是卷积神经网络的新手,只知道特征图以及如何对图像进行卷积以提取特征。我很高兴知道在 CNN 中应用批量标准化的一些细节。

我阅读了这篇论文https://arxiv.org/pdf/1502.03167v3.pdf并且可以理解应用于数据的 BN 算法,但最后他们提到在应用于 CNN 时需要稍作修改:

对于卷积层,我们还希望归一化遵循卷积特性——以便同一特征图的不同元素在不同位置以相同的方式进行归一化。为了实现这一点,我们在一个小批量中联合标准化所有位置的所有激活。在阿尔格。在图 1 中,我们让 B 是一个特征图中所有值的集合,该集合跨越小批量的元素和空间位置——因此对于大小为 m 的小批量和大小为 p × q 的特征图,我们使用 effec - 大小为 m' = |B| 的小批量 = m·pq。我们为每个特征图学习一对参数 γ(k) 和 β(k),而不是每次激活。阿尔格。图 2 进行了类似的修改,因此在推理过程中,BN 变换将相同的线性变换应用于给定特征图中的每个激活。

当他们说“以便同一特征图的不同元素在不同位置以相同方式归一化”时,我完全感到困惑

我知道特征图的含义,不同的元素是每个特征图中的权重。但我不明白位置或空间位置是什么意思。

我根本无法理解下面的句子 “在算法 1 中,我们让 B 成为特征图中跨小批量元素和空间位置的所有值的集合”

如果有人冷淡地用更简单的术语详细说明并解释我,我会很高兴

4

4 回答 4

102

让我们从条款开始。请记住,卷积层的输出是一个 4 秩张量[B, H, W, C],其中B是批量大小,(H, W)特征图大小,C是通道数。一个索引(x, y),其中0 <= x < H0 <= y < W是一个空间位置

通常的批处理规范

现在,这里是如何以通常的方式应用 batchnorm(在伪代码中):

# t is the incoming tensor of shape [B, H, W, C]
# mean and stddev are computed along 0 axis and have shape [H, W, C]
mean = mean(t, axis=0)
stddev = stddev(t, axis=0)
for i in 0..B-1:
  out[i,:,:,:] = norm(t[i,:,:,:], mean, stddev)

基本上,它计算元素之间的H*W*C均值和H*W*C标准差。B您可能会注意到,不同空间位置的不同元素有自己的均值和方差,并且只收集B值。

转换层中的 Batchnorm

这种方式是完全可以的。但是卷积层有一个特殊的属性:过滤器权重在输入图像中共享(你可以在这篇文章中详细阅读)。这就是为什么以相同方式对输出进行归一化是合理的,以便每个输出值B*H*W在不同位置取值的均值和方差。

在这种情况下,代码如下所示(同样是伪代码):

# t is still the incoming tensor of shape [B, H, W, C]
# but mean and stddev are computed along (0, 1, 2) axes and have just [C] shape
mean = mean(t, axis=(0, 1, 2))
stddev = stddev(t, axis=(0, 1, 2))
for i in 0..B-1, x in 0..H-1, y in 0..W-1:
  out[i,x,y,:] = norm(t[i,x,y,:], mean, stddev)

总的来说,只有C平均值和标准差,每一个都是根据B*H*W值计算的。这就是他们所说的“有效小批量”的意思:两者之间的区别仅在于轴选择(或等效的“小批量选择”)。

于 2017-10-11T15:30:16.130 回答
7

对Maxim的回答进行了一些澄清。

我在 Keras 中看到您指定的轴是通道轴,这让我感到困惑,因为对通道进行归一化是没有意义的——因为 conv-net 中的每个通道都被认为是不同的“特征”。即对所有通道进行归一化相当于对卧室数量进行归一化,以平方英尺为单位(来自 Andrew 的 ML 课程的多元回归示例)。这通常不是您想要的——您所做的就是将每个特征本身标准化。即,您将所有示例中的卧室数量标准化为 mu=0 和 std=1,并将所有示例中的平方英尺标准化​​为 mu=0 和 std=1。

这就是您想要 C 均值和标准的原因,因为您想要每个通道/特征的均值和标准。

在我自己检查和测试之后,我意识到了这个问题:这里有点混乱/误解。您在 Keras 中指定的轴实际上是不在计算中的轴。即,除了此参数指定的轴之外,您可以得到每个轴的平均值。这令人困惑,因为它与 NumPy 的工作方式完全相反,其中指定的轴是您执行操作的轴(例如 np.mean、np.std 等)。

我实际上只用 BN 构建了一个玩具模型,然后手动计算了 BN - 在所有 3 个第一维 [m,n_W,n_H] 上取平均值,std 并得到 n_C 结果,计算 (X-mu)/std(使用广播)并得到与 Keras 结果相同的结果。

希望这可以帮助任何像我一样困惑的人。

于 2019-10-19T09:04:29.643 回答
3

我对我说的话只有 70% 的把握,所以如果它没有意义,请在否决之前编辑或提及它。

关于locationspatial location:它们表示图像或特征图中像素的位置。特征图类似于表示概念的稀疏修改版本的图像。

关于so that different elements of the same feature map, at different locations, are normalized in the same way:一些归一化算法是局部的,因此它们依赖于它们附近的环境(位置),而不是图像中相距较远的事物。它们可能意味着每个像素,无论它们的位置如何,都被视为一组元素,独立于它的直接特殊环境。

About In Alg. 1, we let B be the set of all values in a feature map across both the elements of a mini-batch and spatial locations:他们获得了小批量中每个训练示例的每个值的平面列表,并且该列表结合了它们在特征图上的位置。

于 2016-07-25T01:07:34.230 回答
0
  1. 首先我们需要明确一个内核的深度是由前一个特征图的通道数决定的,而这一层的内核数决定了下一个特征图(下一层)的通道数。
  2. 那么我们应该明确每个内核(通常是三个维度的)将在下一层只生成一个通道的特征图。
  3. 第三,我们应该尝试接受生成的特征图中的每个点(无论它们的位置如何)都是由同一个内核通过在前一层上滑动生成的。因此,它们可以被视为由该内核生成的分布,并且可以被视为随机变量的样本。然后应该对它们进行平均以获得平均值,然后是方差。(它不是死板,只有助于理解)这就是他们所说的“以便同一特征图的不同元素,在不同的位置,以相同的方式归一化”
于 2020-03-17T06:54:54.617 回答