Keras 凯拉斯:model.evaluate\u生成器和model.predict\u生成器之间有什么区别

Keras 凯拉斯:model.evaluate\u生成器和model.predict\u生成器之间有什么区别,keras,Keras,我使用keras数据增强来执行图像分类(十类图像)。最后一次训练的结果如下: Epoch 50/50 4544/4545 [============================>.] - ETA: 0s - loss: 0.7628 - acc: 0.7359 loss: 0.762710434054 New learning rate: 0.00214407973866 4545/4545 [==============================] - 115s - los

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

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
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)
然后通过以下方式评估经过培训的模型:

scores = model.evaluate_generator(test_generator,1514) #1514 testing images
print("Accuracy = ", scores[1])
结果如下:

('Accuracy = ', 0.80713342132152621)
精度与上次训练时获得的精度不完全相同。我不明白两者之间的区别,尽管差别不大

此外,model.predict_生成器给出了完全不同的结果,即如下所示的数组:

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
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\u generator和model.predict\u generator之间的区别是什么


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

predict\u generator
获取测试数据并给出输出


evaluate\u生成器
使用您的测试输入和输出。它首先使用培训输入预测输出,然后通过将其与测试输出进行比较来评估性能。因此,它给出了一个性能度量,即在您的情况下的准确性。

要绘制混淆矩阵,您需要从sklearn导入所述的矩阵

from sklearn.metrics import confusion_matrix
import itertools
import matplotlib.pyplot as plt
为了绘制混淆矩阵,测试标签、类别(最后一个完全连接层的输出数量,即输出层)。看来你已经弄明白了这个部分。接下来,您需要测试标签和预测具有相同的维度,您可以使用np.reforme和np.transpose来获得所需的结果。有关语法和定义,您可以按照下面提到的链接进行操作

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


多谢各位。希望这能对您有所帮助。

我遇到了类似的问题,我解决了在生成器中设置shuffle=False的问题。
我的猜测是,如果序列批次不是元素的乘法,则不考虑最后一个不完整的批次,并且对排除的元素进行洗牌是随机的,这会显著改变结果。

回答得好!我有一个问题,因为evaluate_generator返回平均精度在这种情况下,我如何知道精度的方差?谢谢