“Keras批量标准化”;“坏了吗?”模型无法预测。它真的坏了吗?有办法吗?或关于的具体文档? 简介

“Keras批量标准化”;“坏了吗?”模型无法预测。它真的坏了吗?有办法吗?或关于的具体文档? 简介,keras,predict,batch-normalization,Keras,Predict,Batch Normalization,我正在制作一个分类器来识别图片中是否存在缺陷,在改进模型的过程中,我尝试了批量标准化,主要是利用其加快收敛的能力 虽然它提供了预期的速度优势,但我也观察到一些奇怪的症状: 验证指标远远不够好。当然,它闻起来有点太合适了 在训练过程中的任何一点上计算出的预测都是完全错误的,特别是当从训练数据集中拾取图像时;相应的指标与(val_损失,val_acc)匹配,而不是与培训期间打印的(损失,acc)匹配 这种无法预测的现象是我最担心的证据。一个与训练中预测不一样的模型是无用的 搜查 在谷歌上搜索,我

我正在制作一个分类器来识别图片中是否存在缺陷,在改进模型的过程中,我尝试了批量标准化,主要是利用其加快收敛的能力

虽然它提供了预期的速度优势,但我也观察到一些奇怪的症状:

  • 验证指标远远不够好。当然,它闻起来有点太合适了
  • 在训练过程中的任何一点上计算出的预测都是完全错误的,特别是当从训练数据集中拾取图像时;相应的指标与(val_损失,val_acc)匹配,而不是与培训期间打印的(损失,acc)匹配
这种无法预测的现象是我最担心的证据。一个与训练中预测不一样的模型是无用的

搜查 在谷歌上搜索,我发现了一些似乎相关的帖子,特别是这篇()也声称存在补丁和拉取请求,但遗憾的是“被拒绝了”

这很有说服力,因为它解释了一种与我的观察相符的失效机制。据我所知,由于BN计算并保持移动统计数据(指数平均值和标准差)以完成其工作,这需要多次迭代才能稳定并变得显著,因此,当这些统计数据不够成熟时,如果从头开始进行预测,它当然会表现不佳(如果我误解了这个概念,请告诉我)

实际问题 但更深入地思考,这并没有真正解决问题,反而引起了进一步的怀疑。我仍然感到困惑:

  • Keras BN被破坏,据说会影响迁移学习的用例,而我的是卷积分类器的经典案例,从标准glorot初始化开始训练。这本应该受到成千上万用户的抱怨,但没有太多讨论)
  • 技术上:如果我的理解是正确的,为什么这些统计数据(因为它们是预测的基础)不保存在模型中,以便可以使用它们的最新更新进行预测?对于任何可训练的参数,在预测时保存和使用它们似乎是完全可行的
  • 管理智慧:如果Keras的BN真的被打破了,那么这样一个致命的错误怎么可能在一年多的时间里都没有得到解决呢?难道真的没有人在使用BN并需要从他们的模型中进行预测吗?甚至没有人能修好它
  • 更实际:相反,如果它不是一个bug,只是对如何使用它的理解不好,那么我是否可以清楚地说明“如何正确地获得使用BN的模型的Keras预测?”(演示代码将不胜感激)
  • 显然,我真的希望正确的问题是最后一个问题,但鉴于有人声称Keras BN破产的证据,我必须包括前面的问题

    SE-OP注释:在把问题关得太宽*之前,请考虑一下,因为不清楚问题是什么(Kas BN被破坏,或者用户不能正确使用它),我必须提供更多的方向,其中任何想要回答的人都可以选择。 细节
    • 我使用的keras 2.2.4来自Python3.6虚拟环境(在pyenv/virtualenv下)
    • 数据通过一个经典的
      ImageDataGenerator()
      +
      flow\u from\u directory()
      /
      flow\u from\u dataframe()
      方案进行传输(虽然放大被关闭:只应用了
      rescale=1./255
      ),但我也尝试将它们设置为静态
    • 实际上,最后,为了验证上述行为,我只生成了一个数据集
      x,y=next(valid\u generator)
      ,并使用一个独特的批处理方案进行培训和验证。在培训方面,它会收敛(是的,目的就是让它过度拟合!),而在验证方面,这两个指标都很差,预测完全错误且不稳定(几乎是随机的)
    • 在此设置中,如果BN关闭,
      val_loss
      val_acc
      loss
      acc
      完全匹配,并且与我可以从训练结束后计算的预测中获得的匹配
    更新 在编写问题的最小示例的过程中,在努力证明问题后,我认识到问题在不同的机器中显示/未显示。特别是,这个问题在运行Keras 2.3.1的主机上很明显,而另一台运行Keras 2.2.4的主机上没有显示出来。
    我将尽快在这里发布一个最小的示例以及具体的模块版本。

    您必须包括您的示例(我们可以运行的实际代码),根据您的说法,您的示例已被破坏,我已经多次使用Keras的BN层,它工作正常,所以我不清楚您遇到的确切问题。请参阅谢谢@OverLordGoldDragon,我查看了链接并再次发现。那么Keras BN肯定被窃听了,每个使用它的人都接受从中获取不合理的预测?真不敢相信this@Matias,给你,第一个声称它很好用的人。我将尽快发布我自己的简约代码示例(顺便说一句,之前的注释链接包括代码(但没有解决方案)。提供的链接@OverLordGoldDragon显示了tf.keras中的问题,而不是keras,它们是不同的实现。tf.keras中肯定会有bug,因此示例非常重要。您必须包含示例(我们可以运行的实际代码)据你所说,我已经使用过Keras的BN层很多次了,效果很好,所以我不清楚你到底有什么问题。谢谢@OverLordGoldDragon,我再次查看了链接并发现了。所以Keras BN肯定被窃听了,所有使用它的人都接受从中获得没有意义的预测?我不敢相信this@Mati作为,