Warum sagen CNN-Modelle manchmal nur eine Klasse von allen anderen voraus?

Jan 18 2021

Ich bin relativ neu in der Deep-Learning-Landschaft, also sei bitte nicht so gemein wie Reddit! Es scheint eine allgemeine Frage zu sein, daher werde ich meinen Code hier nicht angeben, da dies nicht notwendig erscheint (wenn ja , hier der Link zu colab ).

Ein bisschen zu den Daten: Die Originaldaten finden Sie hier . Es ist eine verkleinerte Version des Originaldatensatzes von 82 GB.

Sobald ich mein CNN darauf trainiert habe, sagt es jedes Mal "Keine diabetische Retinopathie" (No DR) voraus, was zu einer Genauigkeit von 73% führt. Ist der Grund dafür nur die große Menge an No DR-Bildern oder etwas anderem? Ich habe keine Ahnung! Die 5 Klassen, die ich zur Vorhersage habe, sind ["Mild", "Moderate", "No DR", "Proliferative DR", "Severe"].

Es ist wahrscheinlich nur schlechter Code, ich hatte gehofft, ihr könntet helfen

Antworten

1 Ivan Jan 18 2021 at 00:21

Ich wollte gerade einen Kommentar abgeben:

Ein strengerer Ansatz wäre es, mit der Messung Ihrer Datensatzbilanz zu beginnen: Wie viele Bilder jeder Klasse haben Sie? Dies wird wahrscheinlich eine Antwort auf Ihre Frage geben.

Aber ich konnte mir nicht helfen, mir den Link anzusehen, den du gegeben hast. Kaggle gibt Ihnen bereits einen Überblick über den Datensatz:

Schnelle Berechnung : 25,812 / 35,126 * 100 = 73%. Das ist interessant, Sie sagten, Sie hätten eine Genauigkeit von 74%. Ihr Modell lernt anhand eines unausgeglichenen Datensatzes, wobei die erste Klasse überrepräsentiert ist. Dies 25k/35kist enorm. Meine Hypothese ist, dass Ihr Modell weiterhin die erste Klasse vorhersagt, was bedeutet, dass Sie im Durchschnitt eine Genauigkeit von erhalten 74%.

Was Sie tun sollten , ist Ihren Datensatz auszugleichen. Zum Beispiel, indem nur 35,126 - 25,810 = 9,316Beispiele aus der ersten Klasse während einer Epoche erscheinen. Noch besser ist es, wenn Sie Ihren Datensatz über alle Klassen verteilen, sodass jede Klasse pro Epoche nur n- mal angezeigt wird.

2 Shai Jan 18 2021 at 04:30

Wie Ivan bereits bemerkt hat, haben Sie ein Problem mit dem Klassenungleichgewicht. Dies kann gelöst werden über:

  1. Online Hard Negative Mining: Bei jeder Iteration nach Berechnung des Verlusts können Sie alle Elemente im Stapel sortieren, die zur Klasse "no DR" gehören, und nur die schlechtesten beibehalten k. Dann schätzen Sie den Gradienten nur mit diesen schlechteren k und verwerfen den Rest.
    siehe z. B.:
    Abhinav Shrivastava, Abhinav Gupta und Ross Girshick Training Region-basierte Objektdetektoren mit Online Hard Example Mining (CVPR 2016)

  2. Fokusverlust: Eine Modifikation für den Kreuzentropieverlust "Vanille" kann verwendet werden, um das Klassenungleichgewicht zu beseitigen.


Verwandte Beiträge dies und das .