禁用 Keras 批量标准化/标准化

Posted

技术标签:

【中文标题】禁用 Keras 批量标准化/标准化【英文标题】:Disable Keras batch normalization/standardization 【发布时间】:2017-10-21 09:37:57 【问题描述】:

我正在使用一个简单的 Keras 模型进行系列预测。

我将整个系列的输入标准化。

模型预测准确度在训练期间似乎是正确的。但是,当我绘制 model.predict() 函数的输出时,我可以看到输出已经以某种方式缩放。这似乎是某种标准化/标准化类型的缩放。

更改训练的批量大小会影响结果。我尝试将批大小设置为输入集的大小,以便整个系列的训练在单个批中完成,这提高了结果,但仍然是缩放的。

我的假设是这与每个输入批次的标准化或输出标准化有关。我的模型中没有任何BatchNormalization 层。

有没有办法禁用 Keras 中输入/输出的默认规范化/标准化(这种默认行为是否存在)?

我正在使用带有 Tensorflow 后端和 Tensorflow 1.1 的 Keras 2。

【问题讨论】:

你的最终激活层是什么?乙状结肠?谭?那些将始终输出标准化结果。 (这是推荐的。最好将您的预期结果标准化以进行训练) 最后一层的输出应该归一化。我正在使用sigmoid 激活。那不是问题。我相信输入是每批次标准化/标准化的(或输出以某种方式缩放),似乎没有办法将其关闭。 您为什么认为结果是按比例缩放的?您的“基本事实/预期结果数组”是什么?你的意思是训练的准确性还可以,但验证数据的准确性不行? 请提供模型,这不是 Keras 自动做的。 【参考方案1】:

我想我遇到了和你一样的问题。

我检查了 Keras 包中的源代码以获取线索。在 ../keras/engine/training.py 中,一个名为 _standardize_user_dara() 的函数用于训练、评估和预测函数。此函数旨在标准化输入数据(似乎是按批次),但在源代码中(尚)找不到去标准化函数。

我猜 Keras 对输入数据进行了标准化,但没有对输出数据应用去标准化。这个我不确定,因为我没有检查所有的代码,这是不可能的…… 顺便说一句,我阅读了其他一些使用时序数据实现 LSTM 的代码,SKlearn 包用于进行缩放和逆缩放。这可能是一个解决方案……我知道这篇文章很老了,但是如果您对 Keras 中的这种标准化机制有任何想法,请告诉我,这将非常有帮助

【讨论】:

【参考方案2】:

Keras 不会隐式插入 BN 或任何其他规范化。

你一定在观察别的东西。

【讨论】:

以上是关于禁用 Keras 批量标准化/标准化的主要内容,如果未能解决你的问题,请参考以下文章

在 keras 中使用批量标准化进行微调

Keras:使用批量标准化在同一数据集上的不同训练和验证结果

Keras:批量标准化(axis = 1)的等级为0

如何在 keras 中正确使用 U-net 批量标准化?

Keras 中的损失函数和批量大小

如果您使用批量标准化,您是不是需要标准化输入?