gpt4 book ai didi

tensorflow - Keras Batchnormalization,训练数据集的训练和评估结果不同

转载 作者:行者123 更新时间:2023-12-04 18:29:21 27 4
gpt4 key购买 nike

我正在训练一个 CNN,为了调试我的问题,我正在研究实际训练数据的一小部分。

在训练期间,损失和准确性似乎非常合理且相当不错。 (在示例中我使用了相同的小子集进行验证,问题已经在这里显示了)

适合 x_train 并验证 x_train,使用 batch_size=32

Epoch 10/10
1/10 [==>...........................] - ETA: 2s - loss: 0.5126 - acc: 0.7778
2/10 [=====>........................] - ETA: 1s - loss: 0.3873 - acc: 0.8576
3/10 [========>.....................] - ETA: 1s - loss: 0.3447 - acc: 0.8634
4/10 [===========>..................] - ETA: 1s - loss: 0.3320 - acc: 0.8741
5/10 [==============>...............] - ETA: 0s - loss: 0.3291 - acc: 0.8868
6/10 [=================>............] - ETA: 0s - loss: 0.3485 - acc: 0.8848
7/10 [====================>.........] - ETA: 0s - loss: 0.3358 - acc: 0.8879
8/10 [=======================>......] - ETA: 0s - loss: 0.3315 - acc: 0.8863
9/10 [==========================>...] - ETA: 0s - loss: 0.3215 - acc: 0.8885
10/10 [==============================] - 3s - loss: 0.3106 - acc: 0.8863 - val_loss: 1.5021 - val_acc: 0.2707

然而,当我对相同的训练数据集进行评估时,准确度与我在训练期间看到的情况相差甚远(我希望它至少与在 相同的 数据集上训练期间一样好)。

当直接评估或使用
K.set_learning_phase(0)

我得到,类似于验证(使用 batch_size=32 对 x_train 进行评估):
Evaluation Accuracy: 0.266318537392, Loss:  1.50756853772 

如果我将后端设置为学习阶段,结果会再次变得非常好,因此每批标准化似乎运行良好。我怀疑未正确使用累积均值和方差。

所以之后
K.set_learning_phase(1)

我得到(使用 batch_size=32 对 x_train 进行评估):
Evaluation Accuracy: 0.887728457507, Loss:  0.335956037511

我在第一个卷积层之后添加了批量归一化层,如下所示:
model = models.Sequential()
model.add(Conv2D(80, first_conv_size, strides=2, activation="relu", input_shape=input_shape, padding=padding_name))
model.add(BatchNormalization(axis=-1))
model.add(MaxPooling2D(first_max_pool_size, strides=4, padding=padding_name))
...

更进一步,我还会有一些 dropout 层,我将其删除以研究 Batchnormalization 行为。我的打算是在非训练阶段使用模型进行正常预测。

它不应该这样工作,还是我缺少一些额外的配置?

谢谢!

我正在使用 keras 2.0.8 和 tensorflow 1.1.0 (anaconda)

最佳答案

这真的很烦人。当您设置 learning_phase成为 True - 一个 BatchNormalization层直接从数据中获取归一化统计信息,当您有一个小 batch_size 时可能会出现什么问题.前段时间我遇到了类似的问题 - 在这里你有我的解决方案:

  • 构建模型时 - 如果模型将在学习或非学习阶段进行预测,则添加一个选项,并且在此用于学习阶段使用以下类而不是 BatchNormalization :
    class NonTrainableBatchNormalization(BatchNormalization):
    """
    This class makes possible to freeze batch normalization while Keras
    is in training phase.
    """
    def call(self, inputs, training=None):
    return super(
    NonTrainableBatchNormalization, self).call(inputs, training=False)
  • 训练模型后 - 将其权重重置为 NonTrainable复制:
    learning_phase_model.set_weights(learned_model.get_weights())

  • 现在您可以充分享受使用 BatchNormalizationlearning_phase .

    关于tensorflow - Keras Batchnormalization,训练数据集的训练和评估结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230122/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com