pytorch中的BN層簡介

2021-10-25 11:26:12 字數 1694 閱讀 1273

bn層在訓練過程中,會將乙個batch的中的資料轉變成正太分布,在推理過程中使用訓練過程中的引數對資料進行處理,然而網路並不知道你是在訓練還是測試階段,因此,需要手動的加上,需要在測試和訓練階段使用如下函式。

model.train() or model.eval()
在pytorch中,bn層的類的引數有:

torch.nn.batchnorm2d(num_features, eps=1e-05, momentum=0.1, affine=true, track_running_stats=true)
其中affine定義了bn層的引數γ和β是否是可學習的(不可學習預設是常數1和0). bn層的統計資料更新是在每一次訓練階段model.train()後的forward()方法中自動實現的,而不是在梯度計算與反向傳播中更新optim.step()中完成。

bn層的輸出y與輸入x之間的關係是:

y =(

x−ru

nnin

gmea

n)/s

qrt(

runn

ingv

ar+e

ps)∗

gamm

a+be

ta

y = (x - running_mean) / sqrt(running_var + eps) * gamma + beta

y=(x−r

unni

ngm​

ean)

/sqr

t(ru

nnin

**​a

r+ep

s)∗g

amma

+bet

a pytorch中的bn層的動量平滑和常見的動量法計算方式是相反的,預設的momentum=0.1

凍結bn的方式是在模型訓練時,把bn單獨挑出來,重新設定其狀態為eval (在model.train()之後覆蓋training狀態)

def set_bn_eval(m):

classname = m.__class__.__name__

if classname.find('batchnorm') != -1:

m.eval()

def train(self, mode=true):

""" override the default train() to freeze the bn parameters """

super(mynet, self).train(mode)

if self.freeze_bn:

print("freezing mean/var of batchnorm2d.")

if self.freeze_bn_affine:

print("freezing weight/bias of batchnorm2d.")

if self.freeze_bn:

for m in self.backbone.modules():

if isinstance(m, nn.batchnorm2d):

m.eval()

if self.freeze_bn_affine:

m.weight.requires_grad = false

m.bias.requires_grad = false

報頭中的偏移量作用 網路中BN層的作用

bn層的作用主要有三個 加快網路的訓練和收斂的速度 控制梯度 防止梯度消失 防止過擬合 以sigmoid函式為例,sigmoid函式使得輸出在 0,1 之間,實際上當x道了一定的大小,經過sigmoid函式後輸出範圍就會變得很小 梯度消失 在深度神經網路中,如果網路的啟用輸出很大,其對應的梯度就會很...

關於bn層的進一步認識

前幾天yy 用resnet 152 fintuing 他的網路出現的問題 fine tuning resnet 152 遇到問題 在設定bn層引數use global stats的時候,訓練時應該為false 滑動均值與方差 測試時應該為true 全域性均值與方差 現在我的問題是train的時候設為...

pytorch上的迴圈層和全連線層操作

迴圈層 pytorch中的三種迴圈層的實現 層對應的類 功能torch.nn.rnn 多層rnn單元 torch.nn.lstm 多層長短期記憶lstm單元 torch.nn.gru 多層門限迴圈gru單元 torch.nn.rnncell 乙個rnn迴圈層單元 torch.nn.lstmcell ...