Keras的evaluate函数在不同的机器上返回错误的精度

时间:2019-03-04 15:56:32

标签: python-3.x keras anaconda

背景

我在Windows 10中使用Anaconda环境,该环境由MikeMüller按照this post创建:

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,而且我也不知道它们如何在他们测试的机器上运行东西(我自己尝试过,不起作用)。

我还了解到,编译并保存模型的人正在使用MacOS High Sierra,但他也将其用于实验室环境。我需要对此进行跟进。

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

  • Keras issue #7676-将近2年的未解决问题。 OP报告说,他保存的模型在不同的机器上的工作方式不同,这听起来很像我的问题。

  • Keras issue #4875- 2年以上的未解决问题。这条特别的评论似乎是常见的解决方案。我不确定这是否可以解决问题,而且我实际上没有编译此模型的代码。但是,似乎很多人在如何构建和保存他们的模型时发现了问题,因此我可能需要对此进行进一步调查...

我为要求解决方案而道歉,我很高兴看到assertNotEqual(accuracy, 0)通过了。

1 个答案:

答案 0 :(得分:0)

当心

我以前写了一个错误的答案,这很可能是另一个格式不正确的解决方案。请注意,我尚未完全检验该假设。另外请注意,这在Keras社区中仍然是一个未解决的问题,许多人以多种方式弄乱了问题以解决这个问题。


开发我们的解决方案

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

我让我的团队更加认真地对待这个问题。我们到了这样的地步:A在B旁边的桌面上打开了一个终端。A运行​​测试脚本并获得92%的准确性。 B运行脚本并获得2%。此时,我们在同一台机器上使用完全相同的Python环境和Keras设置(~/.keras)。我们还确定我们具有相同的脚本,模型和数据。或者,所以我们认为。

那时我选择怀疑一切。我scp将脚本,模型和数据从A的帐户转移到B的帐户。有效。这可能是解决方案的含义:


对问题的猜想

文件B损坏。 B从Google云端硬盘以及Slack的团队存储中获取了它们。此外,有些是由A通过他的MacBook交付的。这些脚本是完全相同的。模型和数据B实际上在二进制上有所不同,但是在字节上具有相同的大小,在二进制上看上去“相似”,并且可能是编码问题。

  1. 不是Google云端硬盘。我上传并重新下载了正确的文件,没有任何问题。但是,错误的文件开头是这样。

  2. Possibly Slack?也许当B下载A的文件时Slack破坏了编码。

  3. 可能来自MacBook? MacOS会生成许多类似.DS_Store的文件,但我对此并不了解。 MacOS可能在依赖于OS的模型和数据中发挥了作用。我不会仅仅因为我对该操作系统的运行方式一无所知就将其排除在外。我非常怀疑这是因为我碰巧有一台备用MacBook,并且在我们开始在同一台计算机上进行测试之前,我已经将它在那种环境下工作。


最坏的情况

我们接受,我们可以使模型在每个人都可以访问的单台计算机上运行。这是否意味着该模型可能仍无法在其他计算机上运行?不幸的是。

在此问题上浪费了将近2个月之后,我们没有花时间测试其他机器。我希望这种研究和调试可以帮助其他人。我不想让它“没关系,修复它。”