亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > pytorch固定BN層參數的操作

pytorch固定BN層參數的操作

熱門標簽:電銷機器人的風險 開封語音外呼系統代理商 地圖標注線上如何操作 河北防封卡電銷卡 400電話辦理哪種 開封自動外呼系統怎么收費 天津電話機器人公司 手機網頁嵌入地圖標注位置 應電話機器人打電話違法嗎

背景:

基于PyTorch的模型,想固定主分支參數,只訓練子分支,結果發現在不同epoch相同的測試數據經過主分支輸出的結果不同。

原因:

未固定主分支BN層中的running_mean和running_var。

解決方法:

將需要固定的BN層狀態設置為eval。

問題示例:

環境:torch:1.7.0

# -*- coding:utf-8 -*-
import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 3)
        self.bn1 = nn.BatchNorm2d(6)
        self.conv2 = nn.Conv2d(6, 16, 3)
        self.bn2 = nn.BatchNorm2d(16)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 5)

    def forward(self, x):
        # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.bn1(self.conv1(x))), (2, 2))
        # If the size is a square you can only specify a single number
        x = F.max_pool2d(F.relu(self.bn2(self.conv2(x))), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

def print_parameter_grad_info(net):
    print('-------parameters requires grad info--------')
    for name, p in net.named_parameters():
        print(f'{name}:\t{p.requires_grad}')

def print_net_state_dict(net):
    for key, v in net.state_dict().items():
        print(f'{key}')

if __name__ == "__main__":
    net = Net()

    print_parameter_grad_info(net)
    net.requires_grad_(False)
    print_parameter_grad_info(net)

    torch.random.manual_seed(5)
    test_data = torch.rand(1, 1, 32, 32)
    train_data = torch.rand(5, 1, 32, 32)

    # print(test_data)
    # print(train_data[0, ...])
    for epoch in range(2):
        # training phase, 假設每個epoch只迭代一次
        net.train()
        pre = net(train_data)
        # 計算損失和參數更新等
        # ....

        # test phase
        net.eval()
        x = net(test_data)
        print(f'epoch:{epoch}', x)

運行結果:

-------parameters requires grad info--------
conv1.weight: True
conv1.bias: True
bn1.weight: True
bn1.bias: True
conv2.weight: True
conv2.bias: True
bn2.weight: True
bn2.bias: True
fc1.weight: True
fc1.bias: True
fc2.weight: True
fc2.bias: True
fc3.weight: True
fc3.bias: True
-------parameters requires grad info--------
conv1.weight: False
conv1.bias: False
bn1.weight: False
bn1.bias: False
conv2.weight: False
conv2.bias: False
bn2.weight: False
bn2.bias: False
fc1.weight: False
fc1.bias: False
fc2.weight: False
fc2.bias: False
fc3.weight: False
fc3.bias: False
epoch:0 tensor([[-0.0755, 0.1138, 0.0966, 0.0564, -0.0224]])
epoch:1 tensor([[-0.0763, 0.1113, 0.0970, 0.0574, -0.0235]])

可以看到:

net.requires_grad_(False)已經將網絡中的各參數設置成了不需要梯度更新的狀態,但是同樣的測試數據test_data在不同epoch中前向之后出現了不同的結果。

調用print_net_state_dict可以看到BN層中的參數running_mean和running_var并沒在可優化參數net.parameters中

bn1.weight
bn1.bias
bn1.running_mean
bn1.running_var
bn1.num_batches_tracked

但在training pahse的前向過程中,這兩個參數被更新了。導致整個網絡在freeze的情況下,同樣的測試數據出現了不同的結果

Also by default, during training this layer keeps running estimates of its computed mean and variance, which are then used for normalization during evaluation. The running estimates are kept with a defaultmomentumof 0.1. source

因此在training phase時對BN層顯式設置eval狀態:

if __name__ == "__main__":
    net = Net()
    net.requires_grad_(False)

    torch.random.manual_seed(5)
    test_data = torch.rand(1, 1, 32, 32)
    train_data = torch.rand(5, 1, 32, 32)

    # print(test_data)
    # print(train_data[0, ...])
    for epoch in range(2):
        # training phase, 假設每個epoch只迭代一次
        net.train()
        net.bn1.eval()
        net.bn2.eval()
        pre = net(train_data)
        # 計算損失和參數更新等
        # ....

        # test phase
        net.eval()
        x = net(test_data)
        print(f'epoch:{epoch}', x)

可以看到結果正常了:

epoch:0 tensor([[ 0.0944, -0.0372, 0.0059, -0.0625, -0.0048]])
epoch:1 tensor([[ 0.0944, -0.0372, 0.0059, -0.0625, -0.0048]])

補充:pytorch---之BN層參數詳解及應用(1,2,3)(1,2)?

BN層參數詳解(1,2)

一般來說pytorch中的模型都是繼承nn.Module類的,都有一個屬性trainning指定是否是訓練狀態,訓練狀態與否將會影響到某些層的參數是否是固定的,比如BN層(對于BN層測試的均值和方差是通過統計訓練的時候所有的batch的均值和方差的平均值)或者Dropout層(對于Dropout層在測試的時候所有神經元都是激活的)。通常用model.train()指定當前模型model為訓練狀態,model.eval()指定當前模型為測試狀態。

同時,BN的API中有幾個參數需要比較關心的,一個是affine指定是否需要仿射,還有個是track_running_stats指定是否跟蹤當前batch的統計特性。容易出現問題也正好是這三個參數:trainning,affine,track_running_stats。

其中的affine指定是否需要仿射,也就是是否需要上面算式的第四個,如果affine=False則γ=1,β=0 \gamma=1,\beta=0γ=1,β=0,并且不能學習被更新。一般都會設置成affine=True。(這里是一個可學習參數)

trainning和track_running_stats,track_running_stats=True表示跟蹤整個訓練過程中的batch的統計特性,得到方差和均值,而不只是僅僅依賴與當前輸入的batch的統計特性(意思就是說新的batch依賴于之前的batch的均值和方差這里使用momentum參數,參考了指數移動平均的算法EMA)。相反的,如果track_running_stats=False那么就只是計算當前輸入的batch的統計特性中的均值和方差了。當在推理階段的時候,如果track_running_stats=False,此時如果batch_size比較小,那么其統計特性就會和全局統計特性有著較大偏差,可能導致糟糕的效果。

應用技巧:(1,2)

通常pytorch都會用到optimizer.zero_grad() 來清空以前的batch所累加的梯度,因為pytorch中Variable計算的梯度會進行累計,所以每一個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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • pytorch 如何自定義卷積核權值參數
  • pytorch交叉熵損失函數的weight參數的使用
  • Pytorch 統計模型參數量的操作 param.numel()
  • pytorch 一行代碼查看網絡參數總量的實現
  • pytorch查看網絡參數顯存占用量等操作
  • pytorch 優化器(optim)不同參數組,不同學習率設置的操作
  • pytorch LayerNorm參數的用法及計算過程

標簽:駐馬店 常州 宿遷 六盤水 江蘇 成都 山東 蘭州

巨人網絡通訊聲明:本文標題《pytorch固定BN層參數的操作》,本文關鍵詞  pytorch,固定,層,參數,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《pytorch固定BN層參數的操作》相關的同類信息!
  • 本頁收集關于pytorch固定BN層參數的操作的相關信息資訊供網民參考!
  • 推薦文章
    色综合久久天天综合观看| 国产美女在线一区二区三区| 欧美另类videosbestsex| 色综合久久手机在线| 国产成人精品一区二区视频| 日韩男人天堂| 午夜欧美成人久久久久久| 国产不卡福利| 精品久久久久久中文字幕2017| 精品视频一区二区三区| 色综合久久天天综合| 国产一区国产二区国产三区| 一级女人毛片人一女人| 久久精品免视看国产明星| 精品视频在线看| 欧美a免费| 亚洲精品中文字幕久久久久久| 国产激情视频在线观看| 韩国三级香港三级日本三级la| 日本乱中文字幕系列| 日本在线www| 麻豆系列国产剧在线观看| 99色视频在线观看| 日本免费乱理伦片在线观看2018| 黄视频网站免费| 国产高清视频免费观看| 日日夜夜婷婷| 可以在线看黄的网站| 国产一级生活片| 精品在线视频播放| 成人免费观看视频| 日韩专区第一页| 午夜在线观看视频免费 成人| 久久国产精品永久免费网站| 国产网站免费视频| 免费毛片播放| 精品美女| 欧美激情一区二区三区在线| 一级毛片视频免费| 国产一区二区福利久久| 天天色成人| 亚久久伊人精品青青草原2020| 精品视频一区二区三区免费| 国产一级生活片| 欧美1区| 成人免费观看网欧美片| 久草免费在线视频| 在线观看成人网 | 欧美1区| 精品毛片视频| 青青久热| 亚洲第一视频在线播放| 日本乱中文字幕系列| 国产视频网站在线观看| 国产福利免费观看| 日韩中文字幕一区| 日本伦理黄色大片在线观看网站| 你懂的在线观看视频| 91麻豆国产福利精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 一级毛片视频在线观看| 精品视频一区二区三区免费| 一级女人毛片人一女人| 精品久久久久久中文| 国产高清在线精品一区a| 国产一区精品| 免费国产在线观看| 欧美爱爱动态| 欧美日本免费| 九九精品久久久久久久久| 韩国三级香港三级日本三级| 黄视频网站在线看| 精品视频一区二区三区| 久久99这里只有精品国产| 国产网站麻豆精品视频| 精品在线观看国产| 国产91素人搭讪系列天堂| 91麻豆国产级在线| 国产精品自拍在线| 国产一区二区精品久久91| 成人高清免费| 日日夜人人澡人人澡人人看免| 精品在线观看国产| 999久久66久6只有精品| 国产不卡在线看| 麻豆系列国产剧在线观看| 久久福利影视| 欧美激情一区二区三区视频| 成人免费一级毛片在线播放视频| 欧美另类videosbestsex高清| 日本在线不卡免费视频一区| 中文字幕97| 亚飞与亚基在线观看| 美国一区二区三区| 国产网站免费| 欧美激情中文字幕一区二区| 国产成人啪精品视频免费软件| 精品视频一区二区三区| 国产精品自拍亚洲| 国产亚洲免费观看| 精品久久久久久影院免费| 精品国产三级a| 美女被草网站| 国产成a人片在线观看视频| 国产高清在线精品一区a| 美女免费精品高清毛片在线视| 91麻豆国产福利精品| 免费国产在线观看| 精品国产三级a∨在线观看| 国产91精品一区| 欧美激情一区二区三区中文字幕| 国产视频一区二区在线观看| 99久久网站| 999精品视频在线| 欧美爱爱动态| 999久久久免费精品国产牛牛| a级黄色毛片免费播放视频| 久久国产精品永久免费网站| 九九免费精品视频| 国产91丝袜在线播放0| 欧美激情影院| 四虎影视久久久| 精品视频在线观看免费| 国产极品精频在线观看| 中文字幕97| 日韩在线观看视频免费| 一级毛片视频免费| 高清一级毛片一本到免费观看| 日本免费区| 国产综合91天堂亚洲国产| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人啪精品| 韩国三级视频在线观看| 欧美国产日韩久久久| 久久精品大片| 国产高清视频免费| 天天做日日爱| 日日日夜夜操| 夜夜操天天爽| 欧美一级视频免费观看| 欧美激情伊人| 91麻豆高清国产在线播放| 国产福利免费视频| 日韩中文字幕一区二区不卡| 午夜在线影院| 国产伦精品一区三区视频| 亚洲天堂在线播放| 日韩avdvd| 高清一级片| 欧美另类videosbestsex| 国产伦理精品| 黄视频网站免费| 国产视频久久久| a级黄色毛片免费播放视频| 黄色免费三级| 精品视频一区二区三区免费| 99久久精品国产高清一区二区 | 欧美国产日韩久久久| 日本免费乱理伦片在线观看2018| 精品视频一区二区三区免费| 亚洲 国产精品 日韩| 久久99爰这里有精品国产| 日本特黄特色aa大片免费| 亚洲 国产精品 日韩| 欧美电影免费看大全| 国产成人精品综合久久久| 欧美另类videosbestsex视频| 国产一级生活片| 国产成人精品综合久久久| 青青青草影院 | 99久久网站| 欧美一区二区三区性| 欧美日本韩国| 久久精品店| 国产成人女人在线视频观看| 日韩av东京社区男人的天堂| 日本特黄一级| 国产成人精品影视| 尤物视频网站在线| 日韩中文字幕在线播放| 99热精品在线| 日韩欧美一及在线播放| 精品视频在线观看视频免费视频| 欧美1区| 国产精品12| 国产成人啪精品视频免费软件| 精品久久久久久影院免费| 亚洲天堂一区二区三区四区| 四虎影视久久| 99色视频在线| 你懂的福利视频| 黄视频网站在线看| 999久久久免费精品国产牛牛| 国产不卡在线观看| 精品在线视频播放| 久久精品大片| 欧美1卡一卡二卡三新区| 成人高清视频免费观看| 九九久久国产精品| 麻豆系列 在线视频|