Keras BatchNormalization,样本明智规范化究竟是什么?

时间:2016-06-04 00:45:58

标签: 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 = 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)的平均值,我认为axis = 1<?xml version="1.0" encoding="UTF-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="SchoolTools.HomePage"> <ListView HasUnevenRows="true"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Frame Padding="0,0,0,8" BackgroundColor="#d2d5d7"> <Frame.Content> <Frame Padding="15,15,15,15" OutlineColor="Gray" BackgroundColor="White"> <Frame.Content> <StackLayout Padding="20,0,0,0" Orientation="Horizontal" HorizontalOptions="CenterAndExpand"> <Label x:Name="Internet" Text="Internet" HorizontalOptions="Center"> </Label> <Label x:Name ="Math" Text="Math" HorizontalOptions="Center"> </Label> <Label x:Name="Science" Text="Science" HorizontalOptions="Center"> </Label> <Label x:Name ="Handwriting" Text="Handwriting" HorizontalOptions="Center"> </Label> <Label x:Name ="FlashCards" Text="FlashCards" HorizontalOptions="Center"> </Label> <Label x:Name="Books" Text="Books" HorizontalOptions="Center"> </Label> </StackLayout> </Frame.Content> </Frame> </Frame.Content> </Frame> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </ContentPage> 。在模式1中,我认为它应该独立于批处理中的其他样本进行标准化。所以不应该\n? “假定2D输入”在文档中是什么意思?

1 个答案:

答案 0 :(得分:1)

  

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

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

  

我认为在模式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.])

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