【问题标题】:Keras' model.predict() give an output in binary with softmax activation layerKeras 的 model.predict() 给出带有 softmax 激活层的二进制输出
【发布时间】:2021-04-22 19:24:07
【问题描述】:

我从 Keras 训练了 40 个类的 InceptionResNetV2,并使用 model.evaluate() 对其进行了测试;一切都很好。但是当我尝试对单个图像使用 model.predict() 时,我得到的输出类似于

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] 而不是概率分布。

用于错误重现的 Colab:https://colab.research.google.com/drive/1BTuNdwQK5CqaggBVAfJ1cTTR2Qp0GH6v?usp=sharing

Model Architecture

【问题讨论】:

  • 请提供一些代码来重现...
  • 链接@DavidThery的编辑问题
  • 输出层需要激活,好像它丢失了,你只有一个密集层。例如activation='sigmoid'
  • 在处理多个类时输出激活不应该是'softmax'吗?
  • 是的,没错。你的预测准确吗?如果不是,它似乎过拟合。您可以尝试几件事:第一次查看您提供的数据,第二次查看训练集,模型表现如何?是否可以显示代码,您如何传输预训练的权重?因为您的 colab 从加载模型开始。我认为需要完整的图片。

标签: python tensorflow keras


【解决方案1】:

21 是预测类别的索引,您有 40 个类别。如果你有你的类的列表,即 class_list[etc...] 类是 class_list[21]

【讨论】:

  • 我实际上是在测试一个class_list[0]的类,使用的图片是用来测试的,请参考colab链接
【解决方案2】:

使用 Keras 的内置函数预处理测试图像对我来说很有帮助。

from keras.applications.inception_resnet_v2 import preprocess_input 
img_batch = preprocess_input(img_batch)

【讨论】:

    【解决方案3】:

    而不是model.predict,像这样使用model.predict_proba

    predict_proba(image, batch_size = 32, verbose = 1)
    

    【讨论】:

    • 它给出了与之前相同的结果
    猜你喜欢
    • 2020-07-20
    • 2018-02-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多