我使用VGG16特征提取和微调建立了一个模型。拟合时,validation_generator的准确性很高。但是,当我创建混淆矩阵时,它与拟合模型并不相同。
您可以在此处看到一些重要的代码:
validation_generator = test_datagen.flow_from_directory(
'data/valid',
target_size=(240, 240),
batch_size=batch_size,
class_mode='categorical')
history = model.fit_generator(
train_generator,
#steps_per_epoch=100,
epochs=30,
validation_data=validation_generator,
validation_steps=50)
拟合模型输出,仅复制了最后3个历元。
...
Epoch 28/30
120/120 [==============================] - 70s 580ms/step - loss: 0.0767 - acc: 0.9764 - val_loss: 0.4436 - val_acc: 0.9309
Epoch 29/30
120/120 [==============================] - 70s 587ms/step - loss: 0.0730 - acc: 0.9783 - val_loss: 0.3170 - val_acc: 0.9207
Epoch 30/30
120/120 [==============================] - 70s 586ms/step - loss: 0.0828 - acc: 0.9717 - val_loss: 0.5362 - val_acc: 0.9022
我认为问题在于使用validation_generator创建混淆矩阵。这是我用于的代码:
y_pred = model.predict_generator(validation_generator)
y_pred = y_pred.argmax(-1)
con_mat = tf.math.confusion_matrix(validation_labels.argmax(-1), y_pred)
con_mat = np.array(con_mat)
plot_confusion_matrix(cm = con_mat, classes = train_generator.class_indices.keys(), normalize = False)
注意:假定“ plot_confusion_matrix”功能可以成功运行。因为我在没有数据增强的情况下构建特征提取之前就已经使用过它,所以效果很好。