nn.○○とnn.functional.○○の違い
nn.ReLU()は、nn.Moduleを作ります。つまり、nn.Sequential()に追加できます。反対にnn.functional.reluは、relu関数を呼ぶだけで、もし記述するならforward methodの方に書きます。好きな方を使えば良いみたいですが、個人的には、print(model)とモデルの構造を表示させたときにreluも表示させたいので、nn.ReLU()の方を使います。
nn.functionalだとあくまでforward処理途中に関数を挟み込むだけなので,モデル出力には反映されないみたいです.
また,nnの場合は,予めパラメータを渡し,クラスをインスタンス化します.
そのため,何度も繰り返し使う場合等は,コードが簡略化でき,可読性向上にも繋がるかと思います.
AAP = torch.nn.AdaptiveAvgPool2d(output_size=1) # パラメータを設定し,インスタンス化 AAP(test_tensor1) AAP(test_tensor2) ...
eval()時の注意点
PyTorchではmodel.train()やmodel.eval()によって、モデルのモードを切り替えますが、これらのメソッドによってドロップアウトを行うか否かを自動で切り替えてくれるのはドロップアウトクラス(torch.nn.Dropout)の方です。torch.nn.functional.dropoutの方は、model.eval()などが働きません。関数の引数でtorch.nn.functional.dropout(training=False)などとしなければならないのです。
また,functionalでは,eval()時にオフにされるべき層などが正しく機能しない場合があるそうです.
総括すると,基本的にnnで良さそうですね.