我试图弄清楚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.
我认为应该做的只是将批次中的每个样本标准化,而不是每个其他样本。但是,当我查看调用函数的源代码时,我会看到以下内容。
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输入”在文档中是什么意思?
答案 0 :(得分:1)
在这里,它只计算x的所有x的平均值,在我看来是
(BATCH_SIZE, 128, 56, 56)
我认为。
通过这样做,您已经违反了该图层的合同。这不是二维而是四维输入。
我认为在模式1中它应该独立于批处理中的其他样本进行标准化
确实如此。 K.mean(..., axis=-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.])
您可以看到批次中每个样本的特征都减少了。