【问题标题】:Python: Keras model returns different results for the same data and same modelPython:Keras 模型为相同的数据和相同的模型返回不同的结果
【发布时间】:2020-11-05 09:06:48
【问题描述】:

过去几个小时,我一直在尝试制作我的第一个图像分类模型。为此,我使用了Image classification from scratch 教程。当我按照这些步骤完成时,我设法完成了教程。

与教程中的代码相比,我所做的唯一区别是:

  • 为了加快训练过程,我将 epoch 数从 50 改为 10,
  • 我从make_model 函数中删除了图像增强块(一行代码)。

现在,我正在解决我的问题所在。最后,当我再次尝试获取相同数据和相同模型的预测结果时,结果是不同的。看看这个简单的代码:

>>> for i in range(5):
...     predictions = model.predict(val_ds)
...     predictions_list = [round(pred[0], 3) for pred in predictions]
...     print(predictions_list[:10])

结果:

[0.937, 0.905, 1.0, 0.094, 0.021, 0.095, 0.07, 0.006, 1.0, 1.0]
[0.905, 1.0, 1.0, 1.0, 1.0, 1.0, 0.122, 1.0, 1.0, 0.0]
[0.996, 0.003, 1.0, 0.887, 1.0, 1.0, 0.798, 1.0, 1.0, 1.0]
[1.0, 1.0, 0.819, 0.999, 1.0, 0.887, 0.087, 1.0, 0.914, 1.0]
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.916, 0.102]

我假设,只有在我重新训练模型的情况下,结果才会有所不同。但这不是我的情况!我只重新运行.predict() 方法。所以,我的问题是 - 你能帮我吗,我做错了什么,好吗?我错过了什么吗?

【问题讨论】:

  • 尝试从您的数据集中挑选一张图像并将其提供给您的模型几次。看看输出是否不同?

标签: python tensorflow image-processing keras image-classification


【解决方案1】:

你可以试试下面的代码吗?

>>> val_item = val_ds.take(1)
>>> for i in range(5):
...     predictions = model.predict(val_item)
...     predictions_list = [round(pred[0], 3) for pred in predictions]
...     print(predictions_list[:10])

在您的代码中,您使用的是不同的项目,而不是相同的项目。您可以通过手动打印 val_ds 值来检查它。

【讨论】:

  • 您发送的代码再次打印出不同的结果,因此不起作用。当我打印出val_ds 时,它返回以下内容:<PrefetchDataset shapes: ((None, 180, 180, 3), (None,)), types: (tf.float32, tf.int32)>
  • 另外,当我打印出整个predictions_list 时,它有32 项。但是,由于val_item = val_ds.take(1) 部分,我预计只有 1 个。
  • 您需要设置batch_size = 1 只取1个项目。您正在批量处理。
【解决方案2】:

问题在于读取数据函数tf.keras.preprocessing.image_dataset_from_directory,它的shuffle 参数设置为True

当我再次重新加载数据并像这样设置shuffle=False 时:

>>> val_ds = tf.keras.preprocessing.image_dataset_from_directory(
...     'PetImages',
...     shuffle=False,
...     validation_split=0.2,
...     subset="validation",
...     seed=1337,
...     image_size=image_size,
...     batch_size=batch_size,
... )
>>> for i in range(5):
...     predictions = model.predict(val_ds)
...     predictions_list = [round(pred[0], 3) for pred in predictions]
...     print(predictions_list[:10])

然后结果看起来和我预期的一样:

[0.998, 0.994, 1.0, 1.0, 0.885, 1.0, 0.998, 1.0, 0.979, 1.0]
[0.998, 0.994, 1.0, 1.0, 0.885, 1.0, 0.998, 1.0, 0.979, 1.0]
[0.998, 0.994, 1.0, 1.0, 0.885, 1.0, 0.998, 1.0, 0.979, 1.0]
[0.998, 0.994, 1.0, 1.0, 0.885, 1.0, 0.998, 1.0, 0.979, 1.0]
[0.998, 0.994, 1.0, 1.0, 0.885, 1.0, 0.998, 1.0, 0.979, 1.0]

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2019-10-17
    • 2019-03-12
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多