Warum müssen wir die Bilder normalisieren, bevor wir sie in CNN einfügen?


Antworten:


34

Erste Anmerkung: Sie sollten wirklich auch durch die Standardabweichung jedes Merkmals (Pixel) dividieren. Durch Subtrahieren des Mittelwerts wird die Eingabe auf 0 zentriert, und durch Dividieren durch die Standardabweichung wird die Anzahl der Standardabweichungen, die von dem Mittelwert entfernt sind, zu einem skalierten Merkmalswert.

Um Ihre Frage zu beantworten: Überlegen Sie, wie ein neuronales Netzwerk seine Gewichte lernt. C (NN) lernen durch kontinuierliches Addieren von Gradientenfehlervektoren (multipliziert mit einer Lernrate), die aus der Rückausbreitung berechnet wurden, zu verschiedenen Gewichtsmatrizen im gesamten Netzwerk, während Trainingsbeispiele durchlaufen werden.

Das was hier auffällt ist das "multipliziert mit einer Lernrate".

Wenn wir unsere Eingabe-Trainingsvektoren nicht skalieren würden, wären die Bereiche unserer Verteilungen von Merkmalswerten wahrscheinlich für jedes Merkmal unterschiedlich, und daher würde die Lernrate in jeder Dimension Korrekturen hervorrufen, die sich (proportional) voneinander unterscheiden würden. Wir könnten eine Korrektur in einer Gewichtsdimension überkompensieren, während wir in einer anderen unterkompensieren.

Dies ist nicht ideal, da wir uns möglicherweise in einem oszillierenden (nicht in der Lage sind, ein besseres Maximum im Kosten- (Gewichts-) Raum) -Zustand oder in einem sich langsam bewegenden (zu langsamen, um ein besseres Maximum zu erreichen) Zustand befinden.

Es ist natürlich möglich, eine Lernrate pro Gewicht zu haben, aber es sind noch mehr Hyperparameter, die in ein bereits kompliziertes Netzwerk eingeführt werden müssen, um es zu finden. Im Allgemeinen sind Lernraten Skalare.

Daher versuchen wir, Bilder zu normalisieren, bevor wir sie als Eingabe in einen NN-Algorithmus (oder einen auf einem Gradienten basierenden Algorithmus) verwenden.


1
was ist mit Farbbildern? mache ich das für jeden Farbkanal? würde das nicht die Farbverteilung durcheinander bringen?
user10024395

2
Glaube, du sollst ja. Sie können einfach etwas tun wie:(image - image.mean()) / (image.std() + 1e-8)
JohnAllen

Ist das wirklich hilfreich für das Training? Ich trainiere Objektdetektor, und mit diesem Fitler sind die Bilder wirklich verwirrend, es ist schwer, Objekte zu sehen, die ich erkenne
Darlyn

Es ist sehr hilfreich für das Training in Bezug auf Lernfähigkeit und Genauigkeit - es ist nichts für Sie, es ist für das Modell :) Möglicherweise möchten Sie das nicht normalisierte Bild beim Debuggen ausgeben, damit es für Ihre menschlichen Augen normal erscheint.
Lollercoaster
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.