Das Training eines neuronalen Netzwerks für die Regression sagt immer den Mittelwert voraus


9

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.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

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)

Sind die Bilder Top-Beispiele Ihrer tatsächlichen Beispiele? Sind das 5 separate Proben? Die Bilder scheinen keine Informationen zu enthalten, die zur Verallgemeinerung beitragen könnten. Ich meine, Sie brauchen kein neuronales Netz, um die x, y-Position des weißen Quadrats zu finden. Sie können einfach das Bild analysieren und nach einem weißen Pixel suchen. Erklären Sie etwas mehr über Ihre Vision für dieses Modell. Gibt es ein zeitliches Muster, bei dem Sie den nächsten Ort vorhersagen?
Photox

Hallo, und ja, die Bilder sind 5 separate Beispiele. Ich bin nicht sicher, wie sie für Sie gerendert werden, aber es sollten 5 einzelne quadratische Bilder sein (ich habe das Layout ein wenig geändert, um zu helfen ...). Ja, mir ist klar, dass Sie für diese Aufgabe kein neuronales Netzwerk benötigen, aber es ist nur ein Testexperiment, mit dem ich lernen kann, wie man mit einem neuronalen Netzwerk eine Regression durchführt. Ich verstehe nicht, was Sie damit meinen, dass es keine Informationen gibt, die zur Verallgemeinerung beitragen könnten. Jedes Trainingspaar besteht aus einem quadratischen Bild und einem zweidimensionalen Vektor der (x, y) Position des Quadrats. Danke :)
Karnivaurus

1
1) Ihre Eingabeform auf der ersten Conv-Ebene verwendet 3 (rbg) Kanäle, aber Ihre Daten sind Graustufen (1 Kanal). 2) Sie benötigen nicht so viele Conv-Ebenen und Filter, ich denke sogar eine einzelne Ebene Eine Handvoll kleiner Kerne wird in Ordnung sein.
Photox

Sind Sie sicher, dass Bilder tatsächlich den Zielen entsprechen?
user31264

1
Wie @photox sagt, brauchen Sie die Conv-Schichten nicht. Wenn Sie diese hinzufügen, wird es für den Optimierer schwieriger, eine gute Lösung zu finden. Wenn Sie die 3 Conv-Ebenen entfernen, wird Ihr "Modell" vermutlich funktionieren.
Pieter

Antworten:


9

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/height/width2/heightwidthnn/heightwidthheightwidthPixel 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:

  • Wählen Sie ein schwierigeres Problem, z. B. Bildklassifizierung
  • Fügen Sie Lärm hinzu, z. B. Salz und Pfeffer oder weißes Rauschen
  • Machen Sie das Problem schwieriger, indem Sie beispielsweise die Position eines roten Quadrats vorhersagen, während sich im Hintergrund viele verschiedenfarbige Kreise befinden

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 SGDOptimierer mit Standardwerten?

So können Sie mehrere Optimierungen vornehmen:

  • Verwendung LinearRegressionvon Scikit-Learn. OK, das ist nicht das, was Sie wollen, aber ich möchte nur veranschaulichen, wie übermäßig komplex dieses Modell ist.
  • Entfernen Sie die Conv-Schichten
  • Verringern Sie die Größe der ausgeblendeten DenseEbenen
  • Verwenden Sie den Standard SGDOptimierer
  • Wenn Sie eine versteckte Ebene verwenden, sollten Sie eine sigmoidAktivierung versuchen . Sie können sich vorstellen, dass jeder der Knoten der verborgenen Ebene erkennt, ob sich ein Quadrat an einer bestimmten Stelle befindet.
  • Wenn dies alles nicht funktioniert, experimentieren Sie ein wenig mit der Lernrate, um herauszufinden, ob sie zu hoch oder zu niedrig ist.

Ps

Ich denke, dieser Blogpost von Adit Deshpande wird Ihnen gefallen .


Lassen Sie mich wissen, ob diese Lösungen das Verhalten des Optimierers geändert haben.
Pieter

Danke, das ist sehr nützlich. Ich arbeite daran, Ihre Vorschläge auszuprobieren. Ich verstehe Ihren ersten Punkt jedoch nicht. Ich bin verwirrt darüber, warum es schwieriger zu optimieren ist, wenn das Problem zu einfach ist, als ein komplexeres Problem. Warum ist es für ein bestimmtes Netzwerk schwieriger, ein einfacheres Problem zu optimieren als ein komplexeres Problem? In einem einfachen Problem hätte ich gedacht, dass es sehr starke Gradienten und ein starkes globales Optimum geben würde. Aber Ihr erster Punkt besagt, dass die Einfachheit des Problems die Optimierung schwierig macht, was darauf hindeutet, dass ein komplexeres Problem der Optimierung helfen würde ...
Karnivaurus

0

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.


4
Die Frage besagt, dass das Netzwerk fast immer Null ausgibt. Das wäre ein Fall von schwerer Unteranpassung , nicht von Überanpassung. Es gibt auch keine Lücke zwischen Trainings- und Validierungsfehler in der Lernkurve, was darauf hinweist, dass Überanpassung nicht das Problem ist (der Fehler ist nicht Null, die Skala ist logarithmisch)
user20160

0

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.Verteilung der Variablen, die ich vorhersagen möchte

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.


-1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.