【问题标题】:Keras BatchNormalization, What exactly is sample wise normalization?Keras BatchNormalization,究竟什么是样本标准化规范化?
【发布时间】:2016-06-04 00:45:58
【问题描述】:

我试图弄清楚 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: sample-wise normalization. This mode assumes a 2D input.,我将批处理规范模式设置为 1

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

    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 的平均值,在我的情况下是(BATCH_SIZE, 128, 56, 56) 我认为。我认为它应该在模式 1 下独立于批次中的其他样本进行标准化。所以 axis = 1 不应该吗?另外,文档中的“假设 2D 输入”是什么意思?

【问题讨论】:

    标签: python neural-network keras


    【解决方案1】:

    在这里,它只是计算所有 x 的平均值,在我的情况下,我认为是 (BATCH_SIZE, 128, 56, 56)

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

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

    确实如此。 K.mean(..., axis=-1) 正在减少轴 -1,它与输入的最后一个轴同义。所以假设输入形状为(batchsz, features),轴-1 将是features 轴。

    由于K.meannumpy.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 你能澄清一下“违反该层的合同”是什么意思吗?
    • 我的意思是层定义的前提条件(和其他条件),其中之一是在这种情况下没有遵循的预期输入维度。
    猜你喜欢
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2018-06-03
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多