Ich trainiere ein einfaches Faltungs-Neuronales Netzwerk für die Regression, wobei die Aufgabe darin besteht, die (x, y) Position einer Box in einem Bild vorherzusagen, z.
Die Ausgabe des Netzwerks hat zwei Knoten, einen für x und einen für y. Der Rest des Netzwerks ist ein Standard-Faltungsnetzwerk. Der Verlust ist ein normaler quadratischer Standardfehler zwischen der vorhergesagten Position der Box und der Grundwahrheitsposition. Ich trainiere auf 10000 dieser Bilder und validiere auf 2000.
Das Problem, das ich habe, ist, dass der Verlust selbst nach einem intensiven Training nicht wirklich abnimmt. Nachdem ich die Ausgabe des Netzwerks beobachtet habe, stelle ich fest, dass das Netzwerk dazu neigt, für beide Ausgabeknoten Werte nahe Null auszugeben. Daher ist die Vorhersage des Standorts der Box immer die Mitte des Bildes. Es gibt einige Abweichungen in den Vorhersagen, aber immer um Null. Unten zeigt der Verlust:
Ich habe dies für viel mehr Epochen ausgeführt, als in dieser Grafik gezeigt, und der Verlust nimmt immer noch nie ab. Interessanterweise steigt hier der Verlust tatsächlich an einem Punkt.
Es scheint also, dass das Netzwerk nur den Durchschnitt der Trainingsdaten vorhersagt, anstatt eine gute Passform zu lernen. Irgendwelche Ideen, warum das so sein könnte? Ich benutze Adam als Optimierer mit einer anfänglichen Lernrate von 0,01 und Relus als Aktivierungen
Wenn Sie an einem Teil meines Codes (Keras) interessiert sind, finden Sie ihn unten:
# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))
# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)
# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)
Antworten:
Der Optimierer kann nicht zu einer (sub-) optimalen Lösung konvergieren. Warum? Ihr Problem ist zu einfach und / oder Ihr Modell ist zu komplex.
Zu einfaches Problem
Wie @photox bereits sagte, kann dieses Problem mit nur einer einzigen verborgenen Schicht gelöst werden. Ich vermute sogar, dass es ohne eine versteckte Schicht geht. Das liegt daran, dass dieses Problem linear trennbar ist .
Lassen Sie mich das veranschaulichen. Stellen Sie sich ein neuronales Netzwerk ohne versteckte Schichten und eine lineare Aktivierungsfunktion vor (Sie können es auch als lineare Regression bezeichnen). Um die x-Position des Quadrats zu berechnen, wird jedes Pixel mit dem x-Ausgang verbunden. Die erste Pixelspalte ist mit dem Gewicht . Die zweite Spalte ist mit Gewicht . Dies wird bis zur letzten Spalte (z. B. Spalte ) fortgesetzt, die mit dem Gewicht . Seit2 / Höhe Breite n n / Höhe Breite Höhe ∗ Breite1 / Höhe / Breite 2 / Höhe Breite n n / Höhe Breite Höhe ∗ Breite Pixel sind ungleich Null (z. B. ist die Vorspannung gleich dem Grauwert). Die Aktivierung des x-Ausgangs ist gleich der Mitte des Quadrats. Daher kann eine lineare Funktion die Position des Quadrats berechnen.
Es gibt verschiedene Lösungen:
Zu komplexes Modell
Ihr Modell besteht aus einigen Teilen, die viel Komplexität hinzufügen, ohne dem Optimierer dabei zu helfen, ein süßes Optimum zu finden.
Zum Beispiel die Faltungsschichten. Die erste Schicht hat 32 Faltungsfilter der Größe . Was erwarten Sie von diesen Filtern? Bei der Bildklassifizierung lernen diese Filter, Kanten, Ecken, Verläufe und Blobs zu erkennen. In diesem Fall sind jedoch nur wenige Filter sinnvoll. Ich kann mir eine Kante von links nach rechts und umgekehrt und von oben nach unten und umgekehrt vorstellen. In Ihrem Fall gibt es also ca. 28 Filter, die nur zufälliges Rauschen hinzufügen. Das Löschen dieser (oder nur der gesamten Ebene) erleichtert es dem Optimierer erheblich, ein optimales Optimum zu finden.5 × 5
Ein weiteres Beispiel ist der Adam-Optimierer mit vielen zusätzlichen Parametern. Der Adam-Optimierer funktioniert möglicherweise gut mit diesen Parametern, aber warum beginnen Sie nicht einfach mit einem einfachen
SGD
Optimierer mit Standardwerten?So können Sie mehrere Optimierungen vornehmen:
LinearRegression
von Scikit-Learn. OK, das ist nicht das, was Sie wollen, aber ich möchte nur veranschaulichen, wie übermäßig komplex dieses Modell ist.Dense
EbenenSGD
Optimierersigmoid
Aktivierung versuchen . Sie können sich vorstellen, dass jeder der Knoten der verborgenen Ebene erkennt, ob sich ein Quadrat an einer bestimmten Stelle befindet.Ps
Ich denke, dieser Blogpost von Adit Deshpande wird Ihnen gefallen .
quelle
Es sieht aus wie ein typisches Überanpassungsproblem. Ihre Daten liefern nicht genügend Informationen, um ein besseres Ergebnis zu erzielen. Sie wählen den Komplex NN mit Ihnen alle Nuancen der erinnern Zug Zug Daten. Verlust kann niemals eine Null sein, wie es in Ihrem Diagramm steht. Übrigens scheint Ihre Validierung einen Fehler zu haben, oder der Validierungssatz ist nicht gut für die Validierung, da der Validierungsverlust ebenfalls Null wird.
quelle
Ich habe das gleiche Problem mit meinem Datensatz. Es stellt sich heraus, dass in meinem Fall die Prädiktoren mit einer sehr geringen Varianz hoch konzentriert sind. Sie sollten die Varianz Ihrer Vorhersagevariablen überprüfen und sehen, wie sie verteilt sind.
Einige Transformationen der Ausgabevariablen können jedoch durchgeführt werden, um ihre Skalierung zu ändern oder zu ändern. Dies kann zu einer gleichmäßigeren Typverteilung führen. Beispielsweise wirkt sich bei Bilderkennungsaufgaben der Histogrammausgleich oder die Kontrastverbesserung manchmal zugunsten einer korrekten Entscheidungsfindung aus.
quelle
Ich habe tatsächlich an einem sehr ähnlichen Problem gearbeitet. Grundsätzlich hatte ich ein paar Punkte auf einem weißen Hintergrund und trainierte ein NN, um den Punkt zu erkennen, der zuerst auf dem Hintergrund platziert wurde. Die Art und Weise, wie ich arbeitete, bestand darin, nur eine vollständig verbundene Schicht von Neuronen zu verwenden (also eine 1-Schicht-NN). Für ein 100x100-Bild hätte ich beispielsweise 10.000 Eingangsneuronen (die Pixel), die direkt mit 2 Ausgangsneuronen (den Koordinaten) verbunden sind. In PyTorch wurden beim Konvertieren der Pixelwerte in einen Tensor meine Daten automatisch normalisiert, indem der Mittelwert subtrahiert und durch die Standardabweichung dividiert wurde. Bei normalen Problemen beim maschinellen Lernen ist dies in Ordnung, jedoch nicht für ein Bild, bei dem die Anzahl der farbigen Pixel in einem Bild möglicherweise unterschiedlich ist (dh bei Ihrem Bild, bei dem nur wenige weiße Pixel vorhanden sind). So, Ich habe manuell normalisiert, indem ich alle Pixelintensitätswerte durch 255 geteilt habe (daher liegen sie jetzt im Bereich von 0 bis 1 ohne die typische Normalisierungstechnik, bei der versucht wird, alle Intensitätswerte an eine Normalverteilung anzupassen). Dann hatte ich immer noch Probleme, weil es die durchschnittliche Koordinate der Pixel im Trainingssatz vorhersagte. Meine Lösung bestand also darin, die Lernrate sehr hoch einzustellen, was fast allen ML-Lehrern und -Tutorials widerspricht. Anstatt 1e-3, 1e-4, 1e-5 zu verwenden, wie die meisten Leute sagen, habe ich eine Lernrate von 1 oder 0,1 mit stochastischem Gradientenabstieg verwendet. Dadurch wurden meine Probleme behoben und mein Netzwerk lernte schließlich, sich mein Trainingsset zu merken. Es lässt sich nicht allzu gut auf einen Testsatz verallgemeinern, aber zumindest funktioniert es etwas, was eine bessere Lösung ist als die meisten anderen, die zu Ihrer Frage vorgeschlagen wurden. Sie liegen jetzt im Bereich von 0-1 ohne die typische Normalisierungstechnik, die versucht, alle Intensitätswerte an eine Normalverteilung anzupassen. Dann hatte ich immer noch Probleme, weil es die durchschnittliche Koordinate der Pixel im Trainingssatz vorhersagte. Meine Lösung bestand also darin, die Lernrate sehr hoch einzustellen, was fast allen ML-Lehrern und -Tutorials widerspricht. Anstatt 1e-3, 1e-4, 1e-5 zu verwenden, wie die meisten Leute sagen, habe ich eine Lernrate von 1 oder 0,1 mit stochastischem Gradientenabstieg verwendet. Dadurch wurden meine Probleme behoben und mein Netzwerk lernte schließlich, sich mein Trainingsset zu merken. Es lässt sich nicht allzu gut auf einen Testsatz verallgemeinern, aber zumindest funktioniert es etwas, was eine bessere Lösung ist als die meisten anderen, die zu Ihrer Frage vorgeschlagen wurden. Sie liegen jetzt im Bereich von 0-1 ohne die typische Normalisierungstechnik, die versucht, alle Intensitätswerte an eine Normalverteilung anzupassen. Dann hatte ich immer noch Probleme, weil es die durchschnittliche Koordinate der Pixel im Trainingssatz vorhersagte. Meine Lösung bestand also darin, die Lernrate sehr hoch einzustellen, was fast allen ML-Lehrern und -Tutorials widerspricht. Anstatt 1e-3, 1e-4, 1e-5 zu verwenden, wie die meisten Leute sagen, habe ich eine Lernrate von 1 oder 0,1 mit stochastischem Gradientenabstieg verwendet. Dadurch wurden meine Probleme behoben und mein Netzwerk lernte schließlich, sich mein Trainingsset zu merken. Es lässt sich nicht allzu gut auf einen Testsatz verallgemeinern, aber zumindest funktioniert es etwas, was eine bessere Lösung ist als die meisten anderen, die zu Ihrer Frage vorgeschlagen wurden.
quelle