aks*_*hat 54 machine-learning computer-vision deep-learning conv-neural-network batch-normalization
我是卷积神经网络的新手,只是想知道特征映射以及如何对图像进行卷积以提取特征.我很高兴知道在CNN中应用批量标准化的一些细节.
我读了本文https://arxiv.org/pdf/1502.03167v3.pdf和可以理解的BN算法应用于数据,但最终他们提到,当应用到CNN的轻微修改是必需的:
对于卷积层,我们还希望归一化遵循卷积属性 - 以便在不同位置对同一特征映射的不同元素以相同方式进行归一化.为实现这一目标,我们联合规范了所有地点的小批量激活.在Alg.1,我们令B是该组中跨越小批量的两个元件和空间位置的特征地图的所有值的 - 因此对于小批量大小p×Q的大小为m和特征映射的,我们使用的短跑运动员 - 小型m'= | B |的小批量 = m·pq.我们学习每个特征图的一对参数γ(k)和β(k),而不是每次激活.ALG.类似地修改图2,使得在推理期间,BN变换对给定特征图中的每个激活应用相同的线性变换.
当他们说"以不同位置的相同特征地图的不同元素以相同方式标准化"时,我完全感到困惑 "
我知道哪些特征映射意味着什么,不同的元素是每个特征映射中的权重.但我无法理解什么位置或空间位置意味着什么.
我根本无法理解下面的句子 "在Alg.1中,我们让B成为特征图中所有值的集合,跨越小批量和空间位置的元素"
如果有人冷静地阐述并用更简单的术语解释我,我会很高兴的
Max*_*xim 66
让我们从条款开始.请记住,卷积层的输出是4级张量[B, H, W, C],其中B是批量大小,(H, W)是要素图大小,C是通道数.索引(x, y),其中0 <= x < H和0 <= 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)
Run Code Online (Sandbox Code Playgroud)
基本上,它计算元素之间的H*W*C均值和H*W*C标准差B.您可能会注意到,不同空间位置的不同元素有自己的均值和方差,只收集B值.
这种方式完全有可能.但卷积层有一个特殊属性:在输入图像中共享滤镜权重(您可以在本文中详细阅读).这就是为什么以相同的方式对输出进行标准化是合理的,这样每个输出值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)
Run Code Online (Sandbox Code Playgroud)
总的来说,只有C平均值和标准偏差,并且每一个都是根据B*H*W值计算的.当他们说"有效的小批量"时,这就是他们的意思:两者之间的区别仅在于轴选择(或者等同于"小批量选择").
对马克西姆回答的一些澄清。
我很困惑在 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 结果相同的结果。
希望这可以帮助任何像我一样困惑的人。
我对我所说的话只有 70% 的把握,所以如果它没有意义,请在投票之前进行编辑或提及。
关于location或spatial location:它们表示图像或特征图中像素的位置。特征图相当于表示概念的图像的稀疏修改版本。
关于so that different elements of the same feature map, at different locations, are normalized in the same way:一些归一化算法是局部的,因此它们取决于其附近的周围环境(位置),而不是图像中相距较远的事物。他们可能意味着每个像素,无论其位置如何,都被视为集合中的元素,独立于其直接的特殊周围环境。
关于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:他们获得小批量中每个训练示例的每个值的平面列表,并且该列表组合了所有内容,无论它们在特征图上的位置如何。
| 归档时间: |
|
| 查看次数: |
28281 次 |
| 最近记录: |