pytorch---のBN層パラメータの詳細と応用(1,2,3)(1,2)?
2703 ワード
BN層パラメータ詳細(1,2)一般的にpytorchのモデルは継承 同時に、 のうち
応用テクニック:(1,2)
通常pytorchではoptimizerが使用されます.zero_grad()は、pytorchでVariableで計算された勾配が積算されるため、以前のbatchで累積された勾配をクリアします.batchごとに勾配を再クリアするには、次のようにします.
質問:パラメータnon_blocking、およびpytorchの全体的なフレームワーク??
コード(1)
ここではminibacthを真似するためにbatchが0をクリアしないたびに、一定の回数に蓄積して0をクリアし、重みを更新します.
ここでの勾配は元のaccumulation倍に相当するが,実際には前方伝播の過程でBNにはほとんど影響しない.前方BNはbatchの平均値と分散にすぎないため,この場合pytorchにおけるBNのmomentumパラメータを用いることができ,デフォルトは0.1であり,BNパラメータは以下のように指数移動平均である
x_new_running = (1 - momentum) * x_running + momentum * x_new_observed. momentumリファレンスリンク:https://www.jianshu.com/p/a646cbc913b4,https://www.zhihu.com/question/303070254/answer/573037166
nn.Module
クラスであり、いずれも属性trainning
が訓練状態かどうかを指定し、訓練状態があるかどうかは一部の層のパラメータが固定されているかどうかに影響する.例えばBN
層(BN層試験に対する平均値と分散は統計訓練に合格したときのすべてのbatchの平均値と分散の平均値)またはDropout
層(Dropout層が試験中にすべてのニューロンが活性化された)である.現在のモデルmodel.train()
をトレーニングステータスとして、model
をテストステータスとして指定します.model.eval()
のAPIには、BN
がアフィニティを必要とするかどうかを指定するパラメータと、現在のaffine
の統計的特性を追跡するかどうかを指定するパラメータがいくつかあります.問題が発生しやすいのもちょうどこの3つのパラメータです:track_running_stats
,batch
,trainning
.affine
は、アフィニティが必要かどうか、すなわち上記の式の4番目が必要かどうかを指定し、track_running_stats
の場合affine
は更新を学習できません.一般的にはaffine=False
に設定されます.(ここでは学習可能なパラメータです)γ=1,β=0 \gamma=1,\beta=0γ=1,β=0
およびaffine=True
,trainning
は、トレーニング中のbatchの統計的特性を追跡し、現在入力されているtrack_running_stats
の統計的特性のみに依存するのではなく、分散および平均値を得ることを示す(すなわち、新しいbatchは、以前のbatchの平均および分散に依存する.ここではmomentumパラメータを用いて、指数移動平均のアルゴリズムEMAを参照).逆に、track_running_stats=True
であれば、現在入力されているbatchの統計的特性における平均値と分散を計算するだけである.推論段階において、batch
である場合、track_running_stats=False
が比較的小さい場合、その統計特性はグローバル統計特性と大きくずれ、悪い効果をもたらす可能性がある.応用テクニック:(1,2)
通常pytorchではoptimizerが使用されます.zero_grad()は、pytorchでVariableで計算された勾配が積算されるため、以前のbatchで累積された勾配をクリアします.batchごとに勾配を再クリアするには、次のようにします.
質問:パラメータnon_blocking、およびpytorchの全体的なフレームワーク??
コード(1)
for index,data,target in enumerate(dataloader):
data = data.cuda(non_blocking=True)
target = torch.from_numpy(np.array(target)).float().cuda(non_blocking = Trye)
output = model(data)
loss = criterion(output,target)
#
optimizer.zero_grad()
loss.backward()
optimizer.step()
ここではminibacthを真似するためにbatchが0をクリアしないたびに、一定の回数に蓄積して0をクリアし、重みを更新します.
for index, data, target in enumerate(dataloader):
# Tensor, torch.from_numpy()
data = data.cuda(non_blocking = True)
target = torch.from_numpy(np.array(target)).float().cuda(non_blocking = True)
output = model(data)
loss = criterion(data, target)
loss.backward()
if index%accumulation == 0:
#
optimizer.step()
#
optimizer.zero_grad()
ここでの勾配は元のaccumulation倍に相当するが,実際には前方伝播の過程でBNにはほとんど影響しない.前方BNはbatchの平均値と分散にすぎないため,この場合pytorchにおけるBNのmomentumパラメータを用いることができ,デフォルトは0.1であり,BNパラメータは以下のように指数移動平均である
x_new_running = (1 - momentum) * x_running + momentum * x_new_observed. momentumリファレンスリンク:https://www.jianshu.com/p/a646cbc913b4,https://www.zhihu.com/question/303070254/answer/573037166