KERAS“评估”功能在不同的机器上返回错误的准确性



背景

我在Windows 10中使用Anaconda环境,在MikeMüller的这篇文章之后发表:

conda create -n keras python=3.6
conda activate keras
conda install keras

此环境具有Python 3.6.8,Keras 2.2.4,Tensorflow 1.12.0和Numpy 1.16.1。

我正在为一支刚刚加入的团队的代码优化,甚至无法运行他们的代码。我将其简化为MCVE的测试案例(至少对我而言;不得不提供可测试的例子):

class TestEvaluation(unittest.TestCase):
    def setUp(self):
        # In-house function loads inputs and labels properly.
        self.inputs, self.labels = load_data()
        # Using a pretrained model, known to work.
        self.model = keras.models.load_model('model_name.h5')
        # Passes, and is loaded successfully.
        self.assertIsNotNone(self.model)
    def test_model_evaluation(self):
        # Fails on my machine, reporting high loss and 0% accuracy.
        scores = self.model.evaluate(self.inputs, self.labels)
        accuracy = scores[1] * 100
        self.assertAlmostEqual(accuracy, 93, delta=5)

研究

这种确切的方案从别人的计算机中运行得很好,因此我们推论了以下内容:我们具有相同的代码,模型和数据。因此,应该是环境,对吗?

我构建了更多的anaconda环境,以重现其机器上工作的版本号。但是,这没有解决。而且,这似乎是我通过在线搜索发现的其他人所没有的问题。

我经历了以下其他环境:

  • Python 3.6.4,Keras 2.2.4,Tensorflow 1.12.0,Numpy 1.16.2
    • (虽然是在没有Anaconda的情况下为其他人工作的)
  • Python 3.5.2,Keras 2.2.2,Tensorflow 1.10.0,Numpy 1.15.2

问题

该模型是预估计的,验证集已正确加载,但是Keras未能报告我期望的〜93%的精度。

如何解决此问题的0%准确性?


更新

我对情况有了更多了解。我发现在Ubuntu 18.04上安装Python 3.6环境使我随机猜测(精度约为25%)。因此,它不再是0%!此外,我试图复制一台用于测试很多的机器,该机器具有Ubuntu 16.04.5。这使我的准确性〜46%。我无法完美地复制它,因为Ubuntu迫使我安装了一些软件包时将我更新为16.04.6,而且我也不知道他们如何在与他们测试的机器上运行东西(我尝试过,这不是't工作)。

我还了解到,编译和保存模型的人正在使用Macos High Sierra,但他也可以在实验室环境中工作。我需要跟进这一点。

此外,我一直在网上搜索,发现其他问题相同:

  • KERAS问题#7676-近2年的空旷问题。OP报告了他的保存模型在不同的机器上的工作方式有所不同,这听起来很像我的问题。

  • KERAS问题#4875- 超过2年的开放问题。这个特殊的评论似乎是常见的解决方案。我不确定这是否会解决问题,而且我实际上没有编译该模型的代码。但是,似乎许多人在建立和保存模型的方式中发现了问题,因此我可能需要进一步研究……

我很抱歉提出解决方案,我很高兴看到assertNotEqual(accuracy, 0)通过了。

请注意

我以前写了一个不正确的答案,这很可能是另一个不良的解决方案。请注意,我尚未完全检验这个假设。还要注意,这仍然是卡拉斯社区的一个空旷的问题,许多人以多种方式将事情弄乱了。


开发我们的解决方案

让人们成为可以在我们的实验室计算机以及他的MacBook上运行模型的人。让人们成为不能的人(即我和其他所有人)。

我让我的团队更加重视这个问题。我们到达了A在B旁桌面上打开的终端。A运行测试脚本并获得92%的准确性。B运行脚本并获得2%。此时,我们使用完全相同的Python环境和Keras设置(~/.keras)在同一台计算机上。我们还确保我们拥有相同的脚本,模型和数据。或者,所以我们想。

我选择了那时的一切。我从A帐户到B帐户的脚本,模型和数据scp'D。有效。这是解决方案的含义:


猜测问题

文件B很糟糕。B从Google Drive和Slack上从团队存储中获取它们。此外,有些是通过他的MacBook交付的。脚本是真正的。模型和数据B实际上在二进制方面有所不同,但在字节中的大小相同,在二进制中看起来"相似",并且可能是一个编码的问题。

  1. 不是Google驱动器。我上传并重新下载了正确的文件,没有什么问题。但是,错误的文件是从那里开始的。

  2. 可能会放松吗?也许Slack损坏了B下载A文件时的编码。

  3. 可能来自MacBook?MacOS生成了很多类似.DS_Store的文件,我对此一无所知。MACOS可能在模型中发挥了作用,并且数据依赖于OS。我不会仅仅因为我不了解该操作系统的运行方式而排除在外。我很怀疑这一点,因为我碰巧有一本备用MacBook,并且在我们开始在同一台机器上进行测试之前,我才能在该环境中使用。


最坏情况

我们接受我们可以使该模型在每个人都可以访问的一台计算机上工作。这是否意味着该模型可能仍然在其他机器上不起作用?不幸的是,是的。

浪费了将近2个月的问题后,我们没有花时间测试其他机器。我希望这项研究和调试可以帮助别人。我不想把它留在"不介意的,修复它"上。

相关内容

最新更新