Ich habe ein neuronales Netzwerk mit dem TensorFlow-Backend in Keras (2.1.5) trainiert und auch die Keras-contrib (2.0.8) -Bibliothek verwendet, um einen CRF-Layer als Ausgabe für das Netzwerk hinzuzufügen.
Ich würde gerne wissen, wie ich die Genauigkeit, den Rückruf und den f1-Score für jede Klasse abrufen kann, nachdem ich die Vorhersagen für ein Testset mit dem NN getroffen habe.
Angenommen, Sie haben eine Funktion get_model()
, die genau das gleiche Modell erstellt, das Sie trainiert haben, und einen Pfad weights_path
, der auf Ihre HDF5-Datei verweist, die Ihre Modellgewichte enthält:
model = get_model()
model.load_weights(weights_path)
Dies sollte Ihr Modell ordnungsgemäß laden. Dann müssen Sie lediglich eine ImageDataGenerator
Ihrer Testdaten definieren und das Modell anpassen, um Vorhersagen zu erhalten:
# Path to your folder testing data
testing_folder = ""
# Image size (set up the image size used for training)
img_size = 256
# Batch size (you should tune it based on your memory)
batch_size = 16
val_datagen = ImageDataGenerator(
rescale=1. / 255)
validation_generator = val_datagen.flow_from_directory(
testing_folder,
target_size=(img_size, img_size),
batch_size=batch_size,
shuffle=False,
class_mode='categorical')
Dann können Sie das Modell veranlassen, alle Vorhersagen für Ihr gesamtes Dataset mithilfe der model.predict_generator()
-Methode zu generieren:
# Number of steps corresponding to an Epoch
steps = 100
predictions = model.predict_generator(validation_generator, steps=steps)
Erstellen Sie schließlich eine Konfektionsmatrix mit der metrics.confusion_matrix()
-Methode aus dem sklearn
-Paket:
val_preds = np.argmax(predictions, axis=-1)
val_trues = validation_generator.classes
cm = metrics.confusion_matrix(val_trues, val_preds)
Oder holen Sie sich alle Genauigkeiten, Rückrufe und f1-Scores für alle Klassen mithilfe der metrics.precision_recall_fscore_support()
-Methode von sklearn
(das Argument average=None
gibt Metriken für alle Klassen aus):
# label names
labels = validation_generator.class_indices.keys()
precisions, recall, f1_score, _ = metrics.precision_recall_fscore_support(val_trues, val_preds, labels=labels)
Ich habe es nicht getestet, aber ich denke, das wird Ihnen helfen.
Siehe meine Frage wo ich mich frage, ob ich es richtig mache. Wenn ja, kann es eine Antwort auf Ihre Frage sein.
Schauen Sie sich an sklearn.metrics.classification_report
:
from sklearn.metrics import classification_report
y_pred = model.predict(x_test)
print(classification_report(y_true, y_pred))
gibt dir sowas
precision recall f1-score support
class 0 0.50 1.00 0.67 1
class 1 0.00 0.00 0.00 1
class 2 1.00 0.67 0.80 3
avg / total 0.70 0.60 0.61 5