バッチ正規でPyTorch

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現在のバッチの統計的性質をトレースするかどうかを指定します。問題になりやすいまた、これらの三つのパラメータに起こります:trainningaffinetrack_running_stats

  • これaffineならば、上記第四の式かどうか、すなわち、アフィンかどうかを指定し、γ = 1 ベータ] = 0、γ=を1、0 =ベータ] \ガンマ= 1、\ = 0ベータガンマ] = 1 ベータ] = 0、学習を更新することはできません。通常に設定[10]affine=Falseaffine=True
  • trainningそしてtrack_running_statstrack_running_stats=Trueそれは全体のトレーニングプロセスのバッチ追跡の統計的性質を表し、分散を取得し、意味だけではなく、現在のバッチ入力の統計的性質のみに依存。逆に、track_running_stats=Falseあなただけの平均と分散で現在のバッチ入力の統計的性質を計算します。段階を推論する場合ならば、track_running_stats=Falseこの時点であればbatch_size、比較的小さい、その統計的性質と地球統計的性質が大きな偏差を持つことになり、それが悪い結果につながる可能性があります。

一般的に、trainningそしてtrack_running_stats4つの組み合わせが存在する[7]

  1. trainning=Truetrack_running_stats=Trueこれは、所望の設定トレーニング段階では、BNは、全訓練プロセスバッチの統計的特性を追跡します。
  2. trainning=Truetrack_running_stats=Falseこの時点では、BNは、訓練入力の現在のバッチの統計的性質を計算する可能性も全体的な状況の統計的性質を記述しません。
  3. trainning=Falsetrack_running_stats=Trueこれは期待が設定されているテスト段階で、(保存されているという仮定の下で)訓練されたモデルを使用しますBN前にこの時間running_meanrunning_varし、彼らは更新されません一般的には、唯一の我々は、設定する必要がmodel.eval()どのmodelこの機能を実現するために、BN層が含まれています。[6,8]
  4. trainning=Falsetrack_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_meanrunning_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]。大白话「分散シフトによりドロップアウトバッチ正規間の不調和を理解します」

おすすめ

転載: www.cnblogs.com/hizhaolei/p/11303506.html