BatchNormでPytorch APIは以下のとおりです。
1 torch.nn.BatchNorm1d(num_features、 2つの 3 EPS = 1E-05 、 4 5勢い= 0.1 、 6 7アフィン= 真、 8 9 track_running_stats = TRUE)
モデルは、一般pytorch継承しているnn.Module
クラスは、プロパティがあるtrainning
トレーニング状態、トレーニング状態か層のいくつかは、BN層やドロップアウトとして、パラメータが固定されているかどうかに影響するかどうかを指定します。通常、model.train()
現在のモデル指定model
の状態の訓練のために、model.eval()
テストの状態のための現在のモデルを指定します。
一方、BNのAPIは、いくつかのパラメータが1にされ、より心配する必要がありaffine
、そこにあるアフィンかどうかを指定されたtrack_running_stats
現在のバッチの統計的性質をトレースするかどうかを指定します。問題になりやすいまた、これらの三つのパラメータに起こります:trainning
、affine
、track_running_stats
。
- これ
affine
ならば、上記第四の式かどうか、すなわち、アフィンかどうかを指定し、γ 、γ=を1、0 =ベータ] \ガンマ= 1、\ = 0ベータガンマ] = 1 、ベータ] = 0、学習を更新することはできません。通常に設定[10]affine=False
affine=True
trainning
そしてtrack_running_stats
、track_running_stats=True
それは全体のトレーニングプロセスのバッチ追跡の統計的性質を表し、分散を取得し、意味だけではなく、現在のバッチ入力の統計的性質のみに依存。逆に、track_running_stats=False
あなただけの平均と分散で現在のバッチ入力の統計的性質を計算します。段階を推論する場合ならば、track_running_stats=False
この時点であればbatch_size
、比較的小さい、その統計的性質と地球統計的性質が大きな偏差を持つことになり、それが悪い結果につながる可能性があります。
一般的に、trainning
そしてtrack_running_stats
4つの組み合わせが存在する[7]
trainning=True
、track_running_stats=True
。これは、所望の設定トレーニング段階では、BNは、全訓練プロセスバッチの統計的特性を追跡します。trainning=True
、track_running_stats=False
。この時点では、BNは、訓練入力の現在のバッチの統計的性質を計算する可能性も全体的な状況の統計的性質を記述しません。trainning=False
、track_running_stats=True
。これは期待が設定されているテスト段階で、(保存されているという仮定の下で)訓練されたモデルを使用しますBN前にこの時間running_mean
とrunning_var
し、彼らは更新されません。一般的には、唯一の我々は、設定する必要がmodel.eval()
どのmodel
この機能を実現するために、BN層が含まれています。[6,8]trainning=False
、track_running_stats=False
これは一般的に使用されていない同様の効果(2)が、試験状態で配置され、これは悪い結果につながる、統計的特性をオフセット引き起こす可能性試験バッチ入力のちょうど統計的特性です。
同時に、我々は注意する必要が BN層、running_mean
およびrunning_var
更新がされているforward()
操作を実行したのではなく、optimizer.step()
手動でない場合でも、あなたはトレーニングの状態にあるので、もし、行われstep()
、BNの統計的性質が変化します。として
1 model.train() #は、トレーニング状態にある 2 。3 。4 用のデータ、ラベルにself.dataloader: 5 。6 PRED = モデル(データ) 。7 。8 #BNは統計パラメータのモデルが更新され、running_mean、running_var 9 10の損失= self.loss(PRED、ラベル) 。11 12である #もコードの次の3行を実行し、パラメータの統計的特性は、BN変化する 13である 14 (opt.zero_grad) 15 16 loss.backward() 。17 18である(opt.step )
今回は私がしたいmodel.eval()
確保するために、テスト段階に行くrunning_mean
とrunning_var
。それは結果が異なる場合第1のプレトレーニングモデルと負荷モデルは、テストを再実行している場合時々 、パフォーマンスの少し損失、すべての可能性で、この時間があるtrainning
と、track_running_stats
ここで設定したより多くの注意を必要としません。[8]
参照
[1] ステップピットpytorchと
[2]ヨッフェS、Szegedy C.バッチ正規:.シフトを減らす共変量によるディープ内部ネットワークのトレーニングを加速[C] //機械学習。ONコンファレンス・インターナショナルの国際会議のON JMLR.org、 2015:448から456
。[3] <深い学習最適化戦略-1>バッチ正規化(BN)
。[4] 詳細な深度学習正規化、BN / LN / WN
。[5] https://github.com /pytorch/pytorch/blob/master/torch/nn/modules/batchnorm.py#L23-L24
[6]。https://discuss.pytorch.org/t/what-is-the-running-mean-of- -IF-グラデーション-batchnorm 18870 / -蓄積されている
[7]。BatchNorm2d増加パラメータを理解する方法をtrack_running_stats?
[8]。なぜtrack_running_statsはevalの中にfalseに設定されている
[9]。凍結されたBatchNormで訓練する方法は?
[10]。トレーニング中batchnorm層を固定する適切な方法
[11]。大白话「分散シフトによりドロップアウトバッチ正規間の不調和を理解します」