Warum sollten Sie Bilder normalisieren, indem Sie den Bildmittelwert des Datensatzes anstelle des aktuellen Bildmittelwerts beim Deep Learning subtrahieren?

88

Es gibt einige Variationen beim Normalisieren der Bilder, aber die meisten scheinen diese beiden Methoden zu verwenden:

  1. Subtrahiere den über alle Bilder berechneten Mittelwert pro Kanal (zB VGG_ILSVRC_16_layers )
  2. Über alle Bilder berechnete Subtraktion nach Pixel / Kanal (z. B. CNN_S , siehe auch Caffes Referenznetzwerk )

Die natürliche Herangehensweise würde meines Erachtens jedes Bild normalisieren. Ein Bild, das am helllichten Tag aufgenommen wurde, löst mehr Neuronen aus als ein Nachtbild. Es gibt uns möglicherweise Auskunft über die Zeit, in der wir uns normalerweise um interessantere Merkmale an den Rändern usw. kümmern.

Pierre Sermanet bezieht sich in 3.3.3 auf die lokale Kontrastnormalisierung , die bildbasiert wäre, aber ich bin in keinem der Beispiele / Tutorials darauf gestoßen, die ich gesehen habe. Ich habe auch eine interessante Quora-Frage und den Beitrag von Xiu-Shen Wei gesehen, aber sie scheinen die beiden oben genannten Ansätze nicht zu unterstützen.

Was genau vermisse ich? Handelt es sich um ein Problem mit der Farbnormalisierung oder gibt es ein Papier, in dem erklärt wird, warum so viele diesen Ansatz verwenden?

Max Gordon
quelle
Ich kenne die Antwort nicht, aber haben Sie jede Methode ausprobiert? Unterscheiden sie sich in den Leistungen?
user112758
@ user112758 - Die Implementierung ist ein wenig schmerzhaft (insbesondere für die Pixelanzahl) und ich habe die Erfahrung gemacht, dass das Normalisieren pro Bild problemlos funktioniert, meine Daten jedoch nicht so repräsentativ sind. Ich werde versuchen, mit der Normalisierung zu experimentieren, aber ich bin neugierig, die Motivation hinter diesen (in meinem Kopf) seltsamen Normalisierungsprozeduren zu hören.
Max Gordon
Ok, vielleicht kannst du das in der caffe Google Gruppe caffe GitHub fragen. Ich denke, es würde mehr Experten zu diesem Thema geben.
user112758

Antworten:

58

Durch Subtrahieren des Datensatzmittelwerts werden die Daten "zentriert". Darüber hinaus möchten Sie im Idealfall auch durch den sttdev dieses Features oder Pixels dividieren, wenn Sie jeden Feature-Wert in einen Z-Score normalisieren möchten.

Der Grund, warum wir beides tun, ist, dass wir beim Trainieren unseres Netzwerks diese anfänglichen Eingaben multiplizieren (Gewichte) und addieren (Verzerrungen), um Aktivierungen auszulösen, die wir dann mit den Verläufen auf zurückpropagieren trainiere das Modell.

Wir möchten in diesem Prozess, dass jedes Feature einen ähnlichen Bereich hat, damit unsere Farbverläufe nicht außer Kontrolle geraten (und wir nur einen globalen Lernratenmultiplikator benötigen).

Eine andere Möglichkeit ist, dass Deep-Learning-Netzwerke traditionell viele Parameter gemeinsam nutzen - wenn Sie Ihre Eingaben nicht auf eine Weise skaliert hätten, die zu ähnlich variierenden Merkmalswerten geführt hätte (dh über den gesamten Datensatz durch Subtrahieren des Mittelwerts), würde dies nicht der Fall sein passieren sehr leicht, weil ein Teil des Bildgewichts wviel ist und zum anderen ist es zu klein.

Sie werden in einigen CNN-Modellen feststellen, dass die Bleichung pro Bild verwendet wird, was eher Ihren Vorstellungen entspricht.

lollercoaster
quelle
4
Danke für die Antwort. Ich kenne das Konzept, die Daten zu zentrieren und sicherzustellen, dass der Bereich ähnlich ist, um stabile Verläufe zu erzielen. Die Frage ist eher, warum wir dies für den gesamten Datensatz tun müssen und warum dies im Gegensatz zum Bleichen pro Bild helfen würde. Ich möchte eine einfache Referenz, die auf irgendeine Weise zeigt, dass dies das Lernen verbessert, bevor ich die Antwort akzeptiere. Ich weiß, dass die Batch-Normalisierung eine unglaublich leistungsstarke Technik ist, aber ich sehe keinen Zusammenhang mit der gesamten Dataset-Normalisierung.
Max Gordon
Wenn Sie akzeptieren, dass die Batch-Normalisierung gut ist, sind Sie bereits da. Der einzige Grund für die Batch-Normalisierung ist, dass Sie nicht den gesamten Datensatz in den Speicher einpassen können oder das Training verteilen (häufig das gleiche Problem). Deshalb haben wir Chargen.
Lollercoaster
Ich dachte, dass Chargen auch die Grundlage für den stochastischen Gradientenabstieg sind. Auch wenn ich alles in den Speicher einpassen könnte, möchte ich die Parameter häufiger aktualisieren als nach jeder Epoche.
Max Gordon
3
Sie sind. Und Sie können so oft aktualisieren, wie Sie möchten - die Auswirkungen auf die Analyse sind identisch. Das ist das Schöne und Skalierbare am Gradientenabstieg. Der Grund, warum wir den stochastischen Gradientenabstieg (Mischungsreihenfolge + Batching) verwenden, besteht darin, unseren Anstieg durch den Gradientenraum zu glätten. Angesichts eines einzelnen Punktes können wir nicht wirklich sicher sein, dass unser Update uns in Richtung lokaler Maxima treibt. Wenn Sie jedoch genügend Punkte auswählen, steigt diese Wahrscheinlichkeit (in Erwartung).
Lollercoaster
2
Wie können Funktionen auf diese Weise in einen ähnlichen Bereich gebracht werden? Wenn ich zwei Bilder habe, eines im Bereich von 0 bis 255 und eines im Bereich von 0 bis 50 Pixel, beispielsweise mit einem Mittelwert von 50 und einem Standardwert von 15. Durch Normalisieren erhalte ich ein Bild im Bereich von -3,3 bis 13,6 und ein Bild im Bereich von 2 -3,3 bis 0. Sie sind immer noch nicht in der gleichen Skala.
Daniel
9

Vor der Chargennormalisierung wurde die mittlere Subtraktion pro Kanal verwendet, um die Daten um den Mittelwert Null für jeden Kanal (R, G, B) zu zentrieren. Auf diese Weise kann das Netzwerk in der Regel schneller lernen, da die Verläufe für jeden Kanal einheitlich sind. Ich vermute, wenn Sie die Batch-Normalisierung verwenden, ist der Vorverarbeitungsschritt für die mittlere Subtraktion pro Kanal nicht wirklich erforderlich, da Sie ohnehin pro Mini-Batch normalisieren.

Sid M
quelle
1
"Ich vermute, wenn Sie die Batch-Normalisierung verwenden, ist der Vorverarbeitungsschritt für die mittlere Subtraktion pro Kanal nicht wirklich erforderlich, da Sie sowieso pro Mini-Batch normalisieren." Die Batch-Norm bezieht sich jedoch auf die Normalisierung der Gewichte in den Ebenen Ihres Netzwerks, nicht auf die tatsächlichen Eingabebilder. Das sind 2 verschiedene Dinge.
Monica Heddneck
4

Normalisierung pro Bild ist weit verbreitet und sogar die einzige in Tensorflow eingebaute Funktion (vor allem, weil sie sehr einfach zu implementieren ist). Sie wird genau aus dem von Ihnen genannten Grund verwendet (Tag VS Nacht für dasselbe Bild). Wenn Sie sich jedoch ein idealeres Szenario vorstellen, in dem die Beleuchtung gesteuert wird, sind die relativen Unterschiede zwischen den einzelnen Bildern im Algorithmus von großem Wert, und wir möchten dies nicht mit der Normalisierung pro Bild auslöschen (und möchten dies auch tun) Normalisierung im Kontext des gesamten Trainingsdatensatzes durchführen).

JPJ
quelle
4

Dies wird als Vorverarbeitung von Daten vor deren Verwendung bezeichnet. Sie können auf viele Arten verarbeiten, aber es gibt eine Bedingung, dass Sie alle Daten mit derselben Funktion verarbeiten sollten. X_preproc = f (X) und dieses f (.) Sollte nicht von den Daten selbst abhängen. Wenn Sie also das aktuelle Bild verwenden, bedeutet dies, dass Sie dies verarbeiten aktuelles Bild, dann ist dein f (X) tatsächlich wirklich f (X, Bild) und du willst das nicht.

Die von Ihnen angesprochene Bildkontrastnormalisierung dient einem anderen Zweck. Die Normalisierung des Bildkontrasts hilft bei der Funktion.

Aber f (.) Hilft bei der Optimierung, indem alle Funktionen numerisch gleich sind (natürlich ungefähr).

Hacklavya
quelle