nn.Module
のforward()
を呼び出しますか?モデルを呼び出すときに、forward
メソッドが使用されていると思いました。 train()を指定する必要があるのはなぜですか?
model.train()
は、モデルをトレーニングしていることをモデルに伝えます。そのため、ドロップアウトやバッチノルムなど、列車上で異なる動作をするレイヤーやテスト手順が効果的に行われ、何が起こっているかがわかるため、それに応じて動作することができます。
詳細:モードをトレーニングに設定します( ソースコード を参照)。 model.eval()またはmodel.train(mode = False)を呼び出して、テスト中であることを通知できます。モデルをトレーニングするためにtrain
関数を期待するのは多少直感的ですが、そうはしません。モードを設定するだけです。
module.train()
のコードは次のとおりです。
def train(self, mode=True):
r"""Sets the module in training mode."""
self.training = mode
for module in self.children():
module.train(mode)
return self
そして、これは module.eval
です。
def eval(self):
r"""Sets the module in evaluation mode."""
return self.train(False)
モードtrain
とeval
は、モジュールを設定できる2つのモードであり、まったく逆です。
それはただのself.training
フラグであり、現在onlydropout および bachnorm はそのフラグに注意してください。
デフォルトでは、このフラグはTrue
に設定されています。
モデルに意図を知らせるには、モデルをトレーニングするか、モデルを使用して評価するかという2つの方法があります。 model.train()の場合、モデルはレイヤーを学習する必要があることを認識しており、model.eval()を使用すると、新しいものは学習されず、モデルはテストに使用されることを示します。 model.eval()も必要です。これは、バッチノルムを使用している場合はpytorchで、テスト中に1つのイメージのみを渡したい場合、model.eval()が指定されていない場合はpytorchがエラーをスローするためです。