Passer `training = true` lors de l'utilisation de l'entraînement tensorflow

Dec 13 2020

Le tutoriel officiel de TensorFlow indique que nous devons passer base_model (trainin = False) pendant l'entraînement pour que la couche BN ne mette pas à jour la moyenne et la variance. ma question est: pourquoi? pourquoi nous n'avons pas besoin de mettre à jour la moyenne et la variance, je veux dire que BN a la moyenne et la variance d'imagenet et pourquoi il est utile d'utiliser la moyenne et la variance d'imagenet, et de ne pas les mettre à jour sur de nouvelles données? même pendant le réglage fin, dans ce cas, le modèle entier met à jour les poids, mais la couche BN va toujours avoir une moyenne et une variance imagenet. edit: j'utilise ce tutoriel:https://www.tensorflow.org/tutorials/images/transfer_learning

Réponses

1 AlexK. Dec 13 2020 at 20:16

Lorsque le modèle est entraîné à partir de l'initialisation, batchnorm doit être activé pour ajuster sa moyenne et sa variance comme vous l'avez mentionné. Le réglage fin ou l'apprentissage par transfert est une chose un peu différente: vous avez déjà un modèle qui peut faire plus que ce dont vous avez besoin et vous souhaitez effectuer une spécialisation particulière du modèle pré-entraîné pour effectuer votre tâche / travail sur votre ensemble de données. Dans ce cas, une partie des pondérations est gelée et seules certaines couches les plus proches de la sortie sont modifiées. Étant donné que les couches BN sont utilisées tout autour du modèle, vous devez également les congeler. Vérifiez à nouveau cette explication:

Remarque importante concernant les couches BatchNormalization De nombreux modèles contiennent des couches tf.keras.layers.BatchNormalization. Cette couche est un cas particulier et des précautions doivent être prises dans le cadre de la mise au point, comme indiqué plus loin dans ce didacticiel.

Lorsque vous définissez layer.trainable = False, la couche BatchNormalization s'exécutera en mode inférence et ne mettra pas à jour ses statistiques de moyenne et de variance.

Lorsque vous libérez un modèle qui contient des couches BatchNormalization afin de procéder à un réglage fin, vous devez conserver les couches BatchNormalization en mode inférence en passant training = False lors de l'appel du modèle de base. Sinon, les mises à jour appliquées aux poids non entraînables détruiront ce que le modèle a appris.

Source: apprentissage par transfert , détails concernant le gel