テンソルフロートレーニングを使用するときに `training = true`を渡す
TensorFlowの公式チュートリアルでは、BNレイヤーが平均と分散を更新しないように、トレーニング中にbase_model(trainin = False)を渡す必要があると述べています。私の質問は:なぜですか?平均と分散を更新する必要がないのはなぜですか。つまり、BNにはイメージネットの平均と分散があり、新しいデータで更新せずにイメージネットの平均と分散を使用すると便利なのはなぜですか。微調整中であっても、この場合、モデル全体が重みを更新しますが、BNレイヤーは依然としてイメージネットの平均と分散を持ちます。編集:私はこのチュートリアルを使用しています:https://www.tensorflow.org/tutorials/images/transfer_learning
回答
モデルが初期化からトレーニングされる場合、batchnormを有効にして、前述のように平均と分散を調整する必要があります。微調整や転移学習は少し異なります。必要以上のことを実行できるモデルがすでにあり、事前にトレーニングされたモデルの特定の特殊化を実行して、データセットでタスク/作業を実行したいと考えています。この場合、ウェイトの一部が凍結され、出力に最も近い一部のレイヤーのみが変更されます。BNレイヤーはモデル全体で使用されているため、それらも凍結する必要があります。この説明をもう一度確認してください。
BatchNormalizationレイヤーに関する重要な注意事項多くのモデルには、tf.keras.layers.BatchNormalizationレイヤーが含まれています。このレイヤーは特殊なケースであり、このチュートリアルの後半で示すように、微調整のコンテキストで予防策を講じる必要があります。
layer.trainable = Falseを設定すると、BatchNormalizationレイヤーは推論モードで実行され、平均と分散の統計は更新されません。
微調整を行うためにBatchNormalizationレイヤーを含むモデルのフリーズを解除する場合、ベースモデルを呼び出すときにtraining = Falseを渡して、BatchNormalizationレイヤーを推論モードに保つ必要があります。そうしないと、訓練不可能な重みに適用された更新により、モデルが学習した内容が破壊されます。
出典:転移学習、凍結に関する詳細