卷积神经网络中的批量归一化
computer-vision
conv-neural-network
deep-learning
machine-learning
6
0

我是卷积神经网络的新手,只是对特征图以及如何在图像上进行卷积以提取特征有所了解。我很高兴知道在CNN中应用批处理规范化的一些细节。

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

对于卷积层,我们还希望归一化服从卷积属性-以便以相同的方式归一化同一要素图在不同位置的不同元素。为了实现这一目标,我们在所有位置上以小批量的方式联合标准化了所有激活。在Alg。在图1中,我们将B作为特征图上所有小批量和空间位置的所有值的集合–因此,对于大小为m的小批量和大小为p×q的特征图,我们使用effec -大小为m'= | B |的小批量生产= m·pq。我们每个特征图而不是每个激活都学习一对参数γ(k)和β(k)。海藻对图2进行类似的修改,以便在推理期间BN变换将相同的线性变换应用于给定特征图中的每个激活。

当我说“这样,同一要素图在不同位置的不同元素以相同方式归一化”时,我完全感到困惑。

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

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

如果有人能用更简单的方式详细阐述并向我解释,我将感到非常高兴

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

让我们从条款开始。请记住,卷积层的输出是4阶张量[B, H, W, C] ,其中B是批处理大小, (H, W)要素图大小, C是通道数。 0 <= x < H并且0 <= y < W的索引(x, y)空间位置

通常的批处理规范

现在,这是以通常的方式(以伪代码)应用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)

基本上,它计算B元素上的H*W*C均值和H*W*C标准差。您可能会注意到,位于不同空间位置的不同元素具有各自的均值和方差,并且仅收集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值计算的。这就是他们所说的“有效小批量”的意思:两者之间的区别仅在于轴选择(或等效的“小批量选择”)。

收藏
评论

对Maxim答案的一些澄清。

在Keras中看到您指定的轴是通道轴,使我感到困惑,因为对通道进行规范化没有意义-因为conv-net中的每个通道都被认为是不同的“功能”。即,在所有通道上进行归一化等效于对以平方英尺为单位的卧室数量进行归一化(来自安德鲁ML课程的多元回归示例)。通常这不是您想要的-您要做的是单独对每个功能进行标准化。即您将所有示例中的卧室数量标准化为mu = 0和std = 1,并且将所有示例中的平方英尺标准化为mu = 0和std = 1。

这就是为什么要C的均值和标准差,因为您想要每个通道/功能的均值和标准差。

在自己检查并测试之后,我意识到了问题所在:这里有些混乱/误解。您在Keras中指定的轴实际上是不在计算中的轴。也就是说,除此参数指定的轴外,您在所有轴上均得到平均值。这很令人困惑,因为这与NumPy的工作方式正好相反,其中指定的轴是您对其进行操作的轴(例如np.mean,np.std等)。

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

希望这对像我一样困惑的人有所帮助。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号