【问题标题】:Keras: what is the difference between model.evaluate_generator and model.predict_generatorKeras:model.evaluate_generator 和 model.predict_generator 有什么区别
【发布时间】:2017-03-26 16:26:21
【问题描述】:

我使用 keras 数据增强来执行图像分类(十类图像)。最后一个训练 epoch 给出的结果如下:

Epoch 50/50
4544/4545 [============================>.] - ETA: 0s - loss: 0.7628 - acc: 0.7359 loss:  0.762710434054
New learning rate:  0.00214407973866
4545/4545 [==============================] - 115s - loss: 0.7627 - acc: 0.7360 - val_loss: 0.5563 - val_acc: 0.8124

然后通过以下方式评估训练好的模型:

scores = model.evaluate_generator(test_generator,1514) #1514 testing images
print("Accuracy = ", scores[1])

导致以下结果:

('Accuracy = ', 0.80713342132152621)

准确率与上一个训练 epoch 获得的准确率并不完全相同。我不明白区别,即使它是微不足道的。

此外,model.predict_generator 给出了完全不同的结果,它是一个数组,如下所示:

array([[  4.98306963e-06,   1.83774697e-04,   5.49453034e-05, ...,
      9.25193787e-01,   7.74697517e-04,   5.79946618e-06],
   [  2.06657965e-02,   2.35974863e-01,   2.66802781e-05, ...,
      2.16283044e-03,   8.42395966e-05,   2.46680051e-04],
   [  1.40222355e-05,   1.22740224e-03,   7.52218883e-04, ...,
      3.76749843e-01,   3.85622412e-01,   6.47417846e-06],
   ..., 
   [  9.94064331e-01,   1.30184961e-03,   1.08694976e-05, ...,
      1.25828717e-06,   2.29093766e-05,   9.01326363e-04],
   [  7.10375488e-01,   2.01397449e-01,   3.10241080e-06, ...,
      3.66877168e-10,   1.66322934e-05,   1.93767438e-08],
   [  8.13350256e-04,   2.67575349e-04,   6.79878794e-05, ...,
      8.63052785e-01,   9.70983761e-04,   8.54507030e-04]], dtype=float32)

不知道矩阵代表什么,model.evaluate_generator和model.predict_generator有什么区别。

请注意,结果数组的形状为 1514*10。该数组应该是测试图像集的每个类别的预测概率。如果是,如何根据结果计算混淆矩阵?

【问题讨论】:

    标签: keras


    【解决方案1】:

    predict_generator 获取您的测试数据并为您提供输出。

    evaluate_generator 同时使用您的测试输入和输出。它首先使用训练输入预测输出,然后通过将其与测试输出进行比较来评估性能。所以它给出了一个性能衡量标准,即你的情况的准确性。

    【讨论】:

    • 很好的答案!我有一个问题,因为在这种情况下评估生成器返回平均准确度,我怎么知道准确度的方差?谢谢。
    【解决方案2】:

    我遇到了类似的问题,我解决了在生成器中设置 shuffle = False。 我的猜测是,如果训练批次不是元素的乘积,则不考虑最后一个不完整的批次,并且随机排列排除的元素是随机的,结果会发生显着变化。

    【讨论】:

      【解决方案3】:

      要绘制混淆矩阵,您需要从 sklearn 导入上述内容

      from sklearn.metrics import confusion_matrix
      import itertools
      import matplotlib.pyplot as plt
      

      绘制混淆矩阵,test_labels,classes(最后一个全连接层的输出数,输出层)。看来你已经弄清楚了这部分。接下来,您需要 test_labels 和 predictions 具有相同的维度,您可以使用 np.reshape 和 np.transpose 来获得所需的结果。对于语法和定义,您可以按照下面提到的链接进行操作

      https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

      https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html

      现在要绘制混淆矩阵,您可以使用 sklearns 文档中的代码

      https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html

      谢谢。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        • 2015-03-26
        • 2013-08-19
        相关资源
        最近更新 更多