Bestehen von "training = true" beim Tensorflow-Training
Das offizielle Tutorial von TensorFlow besagt, dass wir base_model (trainin = False) während des Trainings übergeben sollten, damit die BN-Schicht Mittelwert und Varianz nicht aktualisiert. meine frage ist: warum? Warum müssen wir Mittelwert und Varianz nicht aktualisieren? Ich meine, BN hat Mittelwert und Varianz von Imagenet und warum ist es nützlich, Mittelwert und Varianz von Imagenet zu verwenden und sie nicht bei neuen Daten zu aktualisieren? Selbst während der Feinabstimmung aktualisiert in diesem Fall das gesamte Modell die Gewichte, aber die BN-Schicht wird immer noch den Mittelwert und die Varianz des Bilds aufweisen. bearbeiten: Ich benutze dieses Tutorial:https://www.tensorflow.org/tutorials/images/transfer_learning
Antworten
Wenn das Modell von der Initialisierung trainiert wird, sollte Batchnorm aktiviert werden, um den Mittelwert und die Varianz wie von Ihnen erwähnt einzustellen. Feinabstimmung oder Transferlernen ist etwas anderes: Sie haben bereits ein Modell, das mehr kann als Sie benötigen, und Sie möchten eine spezielle Spezialisierung des vorab trainierten Modells durchführen, um Ihre Aufgabe / Arbeit an Ihrem Datensatz zu erledigen. In diesem Fall wird ein Teil der Gewichte eingefroren und nur einige Schichten, die der Ausgabe am nächsten liegen, werden geändert. Da BN-Schichten rund um das Modell verwendet werden, sollten Sie sie auch einfrieren. Überprüfen Sie diese Erklärung erneut:
Wichtiger Hinweis zu BatchNormalization-Layern Viele Modelle enthalten tf.keras.layers.BatchNormalization-Layer. Diese Ebene ist ein Sonderfall, und im Zusammenhang mit der Feinabstimmung sollten Vorsichtsmaßnahmen getroffen werden, wie später in diesem Lernprogramm gezeigt wird.
Wenn Sie layer.trainable = False festlegen, wird die BatchNormalization-Ebene im Inferenzmodus ausgeführt und aktualisiert ihre Mittelwert- und Varianzstatistik nicht.
Wenn Sie ein Modell, das BatchNormalization-Ebenen enthält, aufheben, um eine Feinabstimmung vorzunehmen, sollten Sie die BatchNormalization-Ebenen im Inferenzmodus belassen, indem Sie beim Aufrufen des Basismodells training = False übergeben. Andernfalls zerstören die Aktualisierungen der nicht trainierbaren Gewichte das, was das Modell gelernt hat.
Quelle: Transferlernen , Details zum Einfrieren