web-dev-qa-db-ja.com

model.train()はpytorchで何をしますか?

nn.Moduleforward()を呼び出しますか?モデルを呼び出すときに、forwardメソッドが使用されていると思いました。 train()を指定する必要があるのはなぜですか?

23
Aerin

model.train()は、モデルをトレーニングしていることをモデルに伝えます。そのため、ドロップアウトやバッチノルムなど、列車上で異なる動作をするレイヤーやテスト手順が効果的に行われ、何が起こっているかがわかるため、それに応じて動作することができます。

詳細:モードをトレーニングに設定します( ソースコード を参照)。 model.eval()またはmodel.train(mode = False)を呼び出して、テスト中であることを通知できます。モデルをトレーニングするためにtrain関数を期待するのは多少直感的ですが、そうはしません。モードを設定するだけです。

31
Umang Gupta

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)

モードtrainevalは、モジュールを設定できる2つのモードであり、まったく逆です。

それはただのself.trainingフラグであり、現在onlydropout および bachnorm はそのフラグに注意してください。

デフォルトでは、このフラグはTrueに設定されています。

6
prosti

モデルに意図を知らせるには、モデルをトレーニングするか、モデルを使用して評価するかという2つの方法があります。 model.train()の場合、モデルはレイヤーを学習する必要があることを認識しており、model.eval()を使用すると、新しいものは学習されず、モデルはテストに使用されることを示します。 model.eval()も必要です。これは、バッチノルムを使用している場合はpytorchで、テスト中に1つのイメージのみを渡したい場合、model.eval()が指定されていない場合はpytorchがエラーをスローするためです。

1
kelam gautam