我的问题是BatchNormalization(BN)正在规范什么。
我在问,BN是将每个像素的通道单独归一化还是将所有像素归一化。它是基于每个图像还是整个批次的所有通道进行的。
具体而言,BN正在X
上运作。说,X.shape = [m,h,w,c]
。因此,对于axis=3
,它正在" c"维度,即通道数(对于rgb)或要素图的数量。
所以我要说X
是一个rgb,因此有3个频道。 BN是否会做以下事情:(这是BN的简化版本,用于讨论维度方面。我知道伽玛和beta都是学习的,但在这里并不关心。)
对于image=X
中的每个m
:
r = (r-mean)/var
,g = (g-mean)/var
和& b = (b-mean)/var
,其中r,g和& b是红色,绿色和&蓝色通道分别为X
。m
,在keras中,BatchNormalization的文档说:
axis:整数,应该归一化的轴(通常是特征轴)。
例如,在使用
Conv2D
的{{1}}图层之后, 在data_format="channels_first"
中设置axis=1
。
但它在每个维度上究竟做了什么?
答案 0 :(得分:0)
首先,有几种方法可以应用批量标准化,甚至在original paper中专门针对卷积神经网络提到。请参阅this question中的讨论,其中概述了常规和卷积 BN之间的区别,以及两种方法理解的原因。
特别是keras.layers.BatchNormalization
实现了卷积 BN,这意味着对于输入[m,h,w,c]
,它计算c
意味着和m*h*w
值之间的标准偏差。运行平均值,运行std dev和gamma和beta变量的形状只是(c,)
。空间维度(像素)以及批处理中的值共享。
因此,更准确的算法是:对于每个R,G和B通道,计算所有像素和该通道中所有图像的均值/方差,并应用标准化。