婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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層參數的操作的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美老年两性高潮| 精品中文字幕一区二区| 亚洲最新视频在线观看| 国产一区二区三区香蕉| 久久亚洲私人国产精品va媚药| 亚洲成av人**亚洲成av**| 在线一区二区视频| 日韩一区欧美一区| 欧美午夜精品理论片a级按摩| 国产精品久久久久三级| 精品一区免费av| 欧美日韩在线直播| 亚洲图片欧美视频| 欧美日韩国产天堂| 亚洲福利视频一区| 欧美日韩精品三区| 亚洲va韩国va欧美va精品| 777a∨成人精品桃花网| 亚洲亚洲人成综合网络| 69堂成人精品免费视频| 蜜桃av一区二区在线观看| 欧美一区二区三区在线| aaa国产一区| 伊人一区二区三区| 久久亚洲二区三区| 欧美日韩国产免费一区二区| 国产综合色精品一区二区三区| 中文字幕在线观看一区二区| 欧美裸体bbwbbwbbw| 成人禁用看黄a在线| 久久99国产乱子伦精品免费| 中文字幕亚洲不卡| 国产日韩欧美一区二区三区乱码 | 99久久夜色精品国产网站| 秋霞影院一区二区| 亚洲.国产.中文慕字在线| 中文字幕巨乱亚洲| 精品国产凹凸成av人导航| 欧美日韩中文字幕精品| 99精品在线观看视频| 国产在线不卡一区| 久色婷婷小香蕉久久| 亚洲h动漫在线| 午夜亚洲福利老司机| 日韩午夜电影av| 久久精品人人做人人综合 | 亚洲一区在线看| 精品理论电影在线| 91福利在线看| 91丝袜美女网| 成人永久看片免费视频天堂| 久久er99精品| 日韩中文字幕麻豆| 一区二区三区久久| 中文子幕无线码一区tr| 91精品国产手机| 欧洲日韩一区二区三区| 成人h精品动漫一区二区三区| 丝袜美腿高跟呻吟高潮一区| 亚洲午夜影视影院在线观看| 中文字幕日本不卡| 中文字幕乱码久久午夜不卡 | gogogo免费视频观看亚洲一| 美女在线视频一区| 丝袜国产日韩另类美女| 亚洲夂夂婷婷色拍ww47| 一区二区三区中文在线| 亚洲伦理在线精品| 亚洲激情图片小说视频| 亚洲一区二区三区四区中文字幕| 亚洲精品国产精华液| 亚洲国产精品综合小说图片区| 一区二区三区四区中文字幕| 一区二区在线免费观看| 亚洲成人精品在线观看| 亚洲福利视频导航| 免费成人小视频| 国产精品18久久久久久vr | 久久99精品国产麻豆婷婷洗澡| 看片网站欧美日韩| 国产jizzjizz一区二区| 岛国一区二区三区| 91尤物视频在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 欧美少妇bbb| 欧美肥大bbwbbw高潮| 日韩一区二区麻豆国产| 久久久精品天堂| 最好看的中文字幕久久| 亚洲午夜久久久久久久久电影院| 性感美女久久精品| 激情成人综合网| 高清国产午夜精品久久久久久| 成人app软件下载大全免费| www.亚洲激情.com| 8x8x8国产精品| 国产三级一区二区| 中文字幕一区免费在线观看| 自拍偷拍国产精品| 免费日韩伦理电影| 日本在线观看不卡视频| 成人午夜视频福利| 欧美日高清视频| 国产精品毛片高清在线完整版| 亚洲二区在线视频| 成人激情av网| 精品伦理精品一区| 亚洲a一区二区| 国产99精品在线观看| 欧美人伦禁忌dvd放荡欲情| 久久精品亚洲乱码伦伦中文| 亚洲成av人**亚洲成av**| 国产盗摄女厕一区二区三区| 911精品产国品一二三产区| 综合激情成人伊人| 国产白丝精品91爽爽久久| 4438x亚洲最大成人网| 国产精品成人午夜| 精品一区二区在线观看| 欧美另类高清zo欧美| 国产精品久久久久久久久免费相片| 丝袜美腿亚洲一区二区图片| 欧美日韩你懂得| 亚洲永久精品国产| 欧美亚洲综合久久| 亚洲与欧洲av电影| 欧美性大战久久久久久久| 一区二区三区久久| 在线免费视频一区二区| 亚洲精品乱码久久久久久黑人 | 精品国产乱码久久| 日本成人在线看| 欧美人与性动xxxx| 一区二区三区四区中文字幕| 色悠悠久久综合| 国产精品白丝在线| av中文一区二区三区| 亚洲欧美中日韩| 色噜噜狠狠一区二区三区果冻| 国产精品久久久久影院色老大 | 26uuu欧美| 国产一区二区在线观看免费| 精品sm在线观看| 国产乱码字幕精品高清av| 欧美精品一区二区三区一线天视频| 日韩激情视频网站| 91精品欧美久久久久久动漫| 免费观看一级欧美片| 日韩一区二区在线观看视频| 日韩二区三区四区| 欧美久久一区二区| 久久国产尿小便嘘嘘| 精品国产三级a在线观看| 国产呦精品一区二区三区网站| 久久综合九色综合欧美98 | 国产女同性恋一区二区| 国产·精品毛片| 国产精品国产自产拍高清av | 成人av动漫网站| 亚洲电影你懂得| 日韩精品一区二区三区视频播放 | 久久久久国产一区二区三区四区 | 免费观看在线综合| 中文字幕第一页久久| 91免费在线播放| 性久久久久久久久久久久| 久久久久国产精品厨房| 欧美日韩一区二区电影| 国产乱码精品一区二区三区忘忧草| 国产无一区二区| 欧美视频在线观看一区二区| 日本亚洲最大的色成网站www| 国产午夜精品久久久久久久 | eeuss影院一区二区三区 | 性做久久久久久久久| 国产亚洲欧美激情| 欧美美女网站色| 国产成人精品一区二区三区网站观看| 中文字幕在线播放不卡一区| 日韩视频免费观看高清完整版在线观看 | 国产综合成人久久大片91| 亚洲女同一区二区| 久久久天堂av| 69堂成人精品免费视频| 色天使色偷偷av一区二区| 国产综合一区二区| 奇米色一区二区| 亚洲自拍偷拍综合| 国产精品护士白丝一区av| 精品久久久影院| 3d动漫精品啪啪一区二区竹菊| 91麻豆国产在线观看| 丁香五精品蜜臀久久久久99网站| 奇米四色…亚洲| 香蕉影视欧美成人| 亚洲午夜在线电影| 亚洲一二三四在线观看| 最新国产精品久久精品| 国产女主播视频一区二区| 26uuu精品一区二区三区四区在线|