Python Keras BatchNormalization,什么是样本标准化?

Python Keras BatchNormalization,什么是样本标准化?,python,neural-network,keras,Python,Neural Network,Keras,我正试图弄清楚Keras中的批处理规范化到底做了什么。现在我有以下代码 for i in range(8): c = Convolution2D(128, 3, 3, border_mode = 'same', init = 'he_normal')(c) c = LeakyReLU()(c) c = Convolution2D(128, 3, 3, border_mode = 'same', init = 'he_normal')(c) c = LeakyReL

我正试图弄清楚Keras中的批处理规范化到底做了什么。现在我有以下代码

for i in range(8):
    c = Convolution2D(128, 3, 3, border_mode = 'same', init = 'he_normal')(c)
    c = LeakyReLU()(c)
    c = Convolution2D(128, 3, 3, border_mode = 'same', init = 'he_normal')(c)
    c = LeakyReLU()(c)
    c = Convolution2D(128, 3, 3, border_mode = 'same', init = 'he_normal')(c)
    c = LeakyReLU()(c)
    c = merge([c, x], mode = 'sum')
    c = BatchNormalization(mode = 1)(c)
    x = c
根据Keras文档
1:样本标准化,我将批次标准模式设置为1。此模式采用2D输入。

我认为这应该做的只是将批次中的每个样本独立于其他样本进行规范化。但是,当我查看调用函数的源代码时,我看到了以下内容

    elif self.mode == 1:
        # sample-wise normalization
        m = K.mean(x, axis=-1, keepdims=True)
        std = K.std(x, axis=-1, keepdims=True)
        x_normed = (x - m) / (std + self.epsilon)
        out = self.gamma * x_normed + self.beta
在这里,它只是计算所有
x
的平均值,在我的例子中是
(批量大小,128,56,56)
。我认为在模式1下,它应该独立于批次中的其他样本进行正常化。所以轴=1不应该是吗?文档中的“假定二维输入”是什么意思

在这里,它只是计算所有x的平均值,在我的例子中是
(批量大小,128,56,56)

这样做已经违反了该层的合同。这不是二维输入,而是四维输入

我认为在模式1下,它应该独立于批次中的其他样本进行正常化

是的<代码>K.平均值(…,轴=-1)是减少轴-1,它是输入的最后一个轴的同义词。因此,假设输入形状为
(batchsz,features)
,轴-1将是
features

由于
K.mean
numpy.mean
非常相似,您可以自己测试:

>>> x = [[1,2,3],[4,5,6]]
>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> np.mean(x, axis=-1)
array([ 2.,  5.])

您可以看到批次中每个样本的特征都减少了。

nemo您能澄清一下“违反该层的合同”是什么意思吗?我指的是该层定义的先决条件(和其他条件),其中之一是本例中未遵循的预期输入维度。