Warum liegt meine Keras-Vorhersage für eine Bildklasse immer nahe bei 100%?

Nov 27 2020

Ich verwende Keras (zusätzlich zu TF 2.3), um einen Bildklassifizierer zu trainieren. In einigen Fällen habe ich mehr als zwei Klassen, aber oft gibt es nur zwei Klassen (entweder "gut" oder "schlecht"). Ich verwende die tensorflow.keras.applications.VGG16Klasse als Basismodell mit einem benutzerdefinierten Klassifikator wie folgt:

input_layer = layers.Input(shape=(self.image_size, self.image_size, 3), name="model_input")
base_model = VGG16(weights="imagenet", include_top=False, input_tensor=input_layer)
model_head = base_model.output
model_head = layers.AveragePooling2D(pool_size=(4, 4))(model_head)
model_head = layers.Flatten()(model_head)
model_head = layers.Dense(256, activation="relu")(model_head)
model_head = layers.Dropout(0.5)(model_head)
model_head = layers.Dense(len(self.image_classes), activation="softmax")(model_head)

Wie Sie in der letzten (Ausgabe-) Ebene sehen können, verwende ich eine softmaxAktivierungsfunktion. Dann kompiliere ich das gesamte Modell mit der categorical_crossentropyVerlustfunktion und trainiere mit One-Hot-Coded-Bilddaten (Labels).

Alles in allem funktioniert das Modell recht gut, ich bin mit den Ergebnissen zufrieden und erreiche mit unserem Datensatz eine Test- und Validierungsgenauigkeit von über 99%. Eines verstehe ich allerdings nicht:

Wenn ich predict()das Keras-Modell aufrufe und mir die Vorhersageergebnisse ansehe, sind diese immer entweder 0 oder 1 (oder zumindest sehr, sehr nahe daran, wie 0,000001 und 0,999999). Mein Klassifikator scheint also ziemlich sicher zu sein, ob ein Bild entweder zur Klasse "gut" oder "schlecht" gehört (zum Beispiel, wenn ich nur zwei Klassen verwende). Ich ging jedoch davon aus, dass diese Vorhersagen normalerweise nicht so klar sind, eher in Bezug auf "das Modell denkt mit einer Wahrscheinlichkeit von 80%, dass dieses Bild zur Klasse A gehört" - aber wie gesagt, in meinem Fall sind es immer 100% sicher.

Irgendwelche Ideen, warum dies der Fall sein könnte?

Antworten

2 nbro Nov 28 2020 at 09:20

Herkömmliche neuronale Netze können zu sicher sein (dh eine Wahrscheinlichkeit nahe geben$0$ oder $1$) , Auch wenn sie falsch sind, so sollten Sie nicht die Wahrscheinlichkeit interpretieren , dass sie als Maß für die erzeugt Unsicherheit (dh als Maß dafür , wie viel ist es sicher , dass die zugehörige vorhergesagte Klasse der richtigen ist), so dass es im Wesentlichen falsch ist . Weitere Informationen hierzu finden Sie in dieser und dieser Antwort.

Angesichts der Tatsache, dass dieses Überbewusstsein in vielen Szenarien nicht wünschenswert ist (z. B. im Gesundheitswesen, wo Ärzte auch wissen möchten, wie sicher das Modell hinsichtlich seiner Vorhersagen ist, um zu entscheiden, ob dem Patienten ein bestimmtes Medikament verabreicht werden soll oder nicht), hat die ML-Community hat versucht, die Quantifizierung / Schätzung der Unsicherheit in neuronale Netze einzubeziehen. Wenn Sie sich für dieses Thema interessieren, können Sie den Artikel Weight Uncertainty in Neural Network (2015) von Blundell et al. Lesen , in dem ein bestimmter Typ eines Bayes'schen neuronalen Netzwerks vorgeschlagen wird, dh ein neuronales Netzwerk, das die Unsicherheit über die tatsächlichen Werte von modelliert die Gewichte, anhand derer wir auch die Unsicherheit über die Eingaben quantifizieren / schätzen können. Dieses Dokument sollte nicht zu schwer zu lesen sein, wenn Sie bereits mit den Details von Variations-Autoencodern vertraut sind.

Die Antwort auf Ihre Frage lautet also: Ja, es ist möglich, dass die Ausgabewahrscheinlichkeit nahe liegt $1$weil neuronale Netze überbewusst sein können. (Ich gehe davon aus, dass die von tf.kerasder predictMethode zurückgegebenen Werte Wahrscheinlichkeiten sind: Ich erinnere mich nicht mehr, also habe ich angenommen, dass Sie keinen Fehler gemacht haben).

Eine ähnliche Frage wurde bereits in der Vergangenheit gefragt , hier . Die akzeptierte Antwort sollte mehr Details zu verschiedenen Arten von Unsicherheiten und Lösungen enthalten.

1 chessprogrammer Nov 27 2020 at 06:13

Ohne weitere Details über die Art des Datensatzes ist es unmöglich, sicher zu wissen. Hier sind jedoch einige wahrscheinliche Ursachen:

  1. Sie haben Predict on Training Data aufgerufen und keine Daten getestet. Das Netzwerk ist bei Bildern, auf denen es trainiert hat, viel sicherer als bei Bildern, die es noch nie zuvor gesehen hat.

  2. Ihr Modell passt die Daten an. Dies kann passieren, wenn Sie ein übermäßig komplexes Modell für einen kleinen Datensatz verwenden. Vielleicht möchten Sie mit der Regularisierung experimentieren.

  3. Sie haben eine zu kleine Auswahl von Bildern betrachtet. Haben Sie für jedes Bild oder nur für einige Bilder Vorhersagen getroffen? In letzterem Fall haben Sie möglicherweise gerade ein Beispiel ausgewählt, bei dem das Netzwerk sehr zuversichtlich ist.