【问题标题】:Is output of Batch Normalization in Keras dependent on number of epochs?Keras 中批量标准化的输出是否取决于时期数?
【发布时间】:2021-06-24 04:40:22
【问题描述】:

我在 Keras 中找到了批量标准化的输出。 我的模型是:

#导入库

import numpy as np
import keras
from keras import layers
from keras.layers import Input, Dense, Activation,  BatchNormalization, Flatten, Conv2D
from keras.models import Model

#模型

def HappyModel3(input_shape):


    X_input = Input(input_shape, name='input_layer')
    X = BatchNormalization(axis = 1, name = 'batchnorm_layer')(X_input)
    
    X = Dense(1, activation='sigmoid', name='sigmoid_layer')(X)
    
    
    model = Model(inputs = X_input, outputs = X, name='HappyModel3')
    
    return model

    

编译模型 |这里的纪元数是 1

X_train=np.array([[1,1,-1],[2,1,1]])
Y_train=np.array([0,1])

happyModel_1=HappyModel3(X_train[0].shape)
happyModel_1.compile(optimizer=keras.optimizers.RMSprop(), loss=keras.losses.mean_squared_error)
happyModel_1.fit(x = X_train, y = Y_train, epochs = 1 , batch_size = 2, verbose=0 )

为 epochs=1 的模型找到 Batch Normalization 层的输出:

for i in range(0, len(happyModel_1.layers)):
    
    tmp_model = Model(happyModel_1.layers[0].input, happyModel_1.layers[i].output)
    tmp_output = tmp_model.predict(X_train)
    
    if i in (0,1) :
        print(happyModel_1.layers[i].name)
        print(tmp_output.shape)
        print(tmp_output)
        print('\n')

代码输出为:

input_layer
(2, 3)
[[ 1.  1. -1.]
 [ 2.  1.  1.]]


batchnorm_layer
(2, 3)
[[ 0.99003249  0.99388224 -0.99551398]
 [ 1.99647105  0.99388224  0.9971655 ]]

我们在axis=1 | 上进行了标准化 Batch Norm 层输出:在轴 = 1 时,第 1 维均值为 1.5,第 2 维均值为 1,第 3 维均值为 0。 由于它的批次规范,我希望所有 3 个维度的均值都接近 0

当我将 epoch 增加到 1000 时会发生这种情况:

happyModel_2=HappyModel3(X_train[0].shape)
happyModel_2.compile(optimizer=keras.optimizers.RMSprop(), loss=keras.losses.mean_squared_error)
happyModel_2.fit(x = X_train, y = Y_train, epochs = 1000 , batch_size = 2, verbose=0 )

为 epochs=1000 的模型找到 Batch Normalization 层的输出:

for i in range(0, len(happyModel_2.layers)):
    tmp_model = Model(happyModel_2.layers[0].input, happyModel_2.layers[i].output)
    tmp_output = tmp_model.predict(X_train)
    
    if i in (0,1) :
        print(happyModel_2.layers[i].name)
        print(tmp_output.shape)
        print(tmp_output)
        print('\n')

#代码输出

input_layer
(2, 3)
[[ 1.  1. -1.]
 [ 2.  1.  1.]]


batchnorm_layer
(2, 3)
[[ -1.95576239e+00   8.08715820e-04  -1.86621261e+00]
 [  1.95795488e+00   8.08715820e-04   1.86590290e+00]]

我们在axis=1 | 上进行了标准化现在在axis = 1处,批量规范层输出为:第1维均值为0,第2维均值为0,第3维均值为0。这是一个预期的输出

我的问题是:Keras 中批量标准化的输出是否取决于时期数? (可能是的,当我们进行反向传播时,批量标准化参数会受到越来越多的 epoch 的影响)

【问题讨论】:

  • 请在发布后校对并删除不相关的引号(''')。
  • 已删除。谢谢推荐。

标签: python tensorflow keras deep-learning


【解决方案1】:

BatchNormalization 的 keras 文档回答了您的问题:

重要的是,批量标准化在训练和训练期间的工作方式不同 在推理期间。

训练期间会发生什么,即调用model.fit()时会发生什么?

在训练期间 [...],层对其输出进行归一化 使用当前批次输入的均值和标准差。

但是在推理过程中会发生什么,即在您的示例中调用 mode.predict() 时会发生什么?

在推理过程中 [...],该层使用 它在期间看到的批次的平均值和标准偏差 训练。也就是说,它返回(batch - self.moving_mean) / (self.moving_var + epsilon) * gamma + beta

self.moving_meanself.moving_var 是不可训练的变量 每次在训练模式下调用层时都会更新 [...]。

请务必了解,批量标准化将通过查看单个批次的统计数据并通过计算的运行平均值在内部更新 moving_meanmoving_variance 参数来计算训练期间整个训练数据的统计数据(均值和方差)形成单批统计。因此它们不受反向传播的影响。理想情况下,在您的模型已经看到足够的训练示例(或进行了足够的训练 epoch)之后,moving_meanmoving_variance 将对应于整个训练集的统计信息。然后在推理过程中使用这两个参数来规范化测试示例。在训练开始时,这两个参数将被初始化为 0 和 1。进一步的批范数还有两个参数,称为 gamma 和 beta,它们将由优化器更新,因此取决于您的损失。

本质上,是的,在推理过程中批量归一化的输出取决于您训练模型的 epoch 数。首先,由于均值和方差的移动平均值不断变化,其次是由于学习参数 gamma 和 beta。

要更深入地了解批量标准化的工作原理以及为什么需要它,请查看original publication

【讨论】:

  • 在我上面的示例中,训练数据集有 2 个示例或 2 个数据点,模型的批量大小也是 2,这意味着moving_mean 应该相同,因为批量大小 = 数据点。另外,我只是在预测(或查找批范数输出)我的训练集(相同的 2 个数据点),为什么 batch_norm 输出会因时期数而不同?
  • moving_mean 和moving_variance 更新如下:moving_mean = momentum*moving_mean + mean(batch)*(1-momentum)(方差相同),momentum 的默认值为 0.99,moving_mean 默认初始化为 0。您现在会看到即使您的所有数据都包含在一个批次中,moving_mean 也需要多次迭代才能接近您的批次平均值(取决于momentum)。
  • 谢谢!这个信息非常有用。虽然它是在 keras 上写的,但我没有注意到它另外,如果你改变动量 = 0 并且不使用 gamma 和 beta 参数(通过设置 scale=False,center=False),你的 batch_mean 和 batch_var 不会随着时代的数量而改变(给定您的批次包含所有训练数据点)
猜你喜欢
  • 2019-11-13
  • 2017-10-21
  • 1970-01-01
  • 2020-02-25
  • 2018-07-28
  • 2019-10-30
  • 2017-02-17
  • 2017-11-24
  • 2020-01-15
相关资源
最近更新 更多