校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

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

pytorch固定BN層參數(shù)的操作

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

背景:

基于PyTorch的模型,想固定主分支參數(shù),只訓練子分支,結(jié)果發(fā)現(xiàn)在不同epoch相同的測試數(shù)據(jù)經(jīng)過主分支輸出的結(jié)果不同。

原因:

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

解決方法:

將需要固定的BN層狀態(tài)設(shè)置為eval。

問題示例:

環(huán)境: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, 假設(shè)每個epoch只迭代一次
        net.train()
        pre = net(train_data)
        # 計算損失和參數(shù)更新等
        # ....

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

運行結(jié)果:

-------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)已經(jīng)將網(wǎng)絡(luò)中的各參數(shù)設(shè)置成了不需要梯度更新的狀態(tài),但是同樣的測試數(shù)據(jù)test_data在不同epoch中前向之后出現(xiàn)了不同的結(jié)果。

調(diào)用print_net_state_dict可以看到BN層中的參數(shù)running_mean和running_var并沒在可優(yōu)化參數(shù)net.parameters中

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

但在training pahse的前向過程中,這兩個參數(shù)被更新了。導致整個網(wǎng)絡(luò)在freeze的情況下,同樣的測試數(shù)據(jù)出現(xiàn)了不同的結(jié)果

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層顯式設(shè)置eval狀態(tài):

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, 假設(shè)每個epoch只迭代一次
        net.train()
        net.bn1.eval()
        net.bn2.eval()
        pre = net(train_data)
        # 計算損失和參數(shù)更新等
        # ....

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

可以看到結(jié)果正常了:

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層參數(shù)詳解及應(yīng)用(1,2,3)(1,2)?

BN層參數(shù)詳解(1,2)

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

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

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

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

應(yīng)用技巧:(1,2)

通常pytorch都會用到optimizer.zero_grad() 來清空以前的batch所累加的梯度,因為pytorch中Variable計算的梯度會進行累計,所以每一個batch都要重新清空一次梯度,原始的做法是下面這樣的:

問題:參數(shù)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,累積到一定次數(shù)再清0,再更新權(quán)重:

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:
        #用累積的梯度更新權(quán)重
        optimizer.step()
        #清空梯度
        optimizer.zero_grad()

雖然這里的梯度是相當于原來的accumulation倍,但是實際在前向傳播的過程中,對于BN幾乎沒有影響,因為前向的BN還是只是一個batch的均值和方差,這個時候可以用pytorch中BN的momentum參數(shù),默認是0.1,BN參數(shù)如下,就是指數(shù)移動平均

x_new_running = (1 - momentum) * x_running + momentum * x_new_observed. momentum

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《pytorch固定BN層參數(shù)的操作》,本文關(guān)鍵詞  pytorch,固定,層,參數(shù),的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《pytorch固定BN層參數(shù)的操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于pytorch固定BN層參數(shù)的操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    av电影在线观看不卡| 精品一区免费av| 国产精品另类一区| 日韩午夜激情电影| 日韩午夜在线播放| 精品国产一区二区在线观看| 日韩视频免费观看高清完整版在线观看| 成人精品免费视频| av亚洲精华国产精华精| 色中色一区二区| 欧美视频自拍偷拍| 91精品国产欧美日韩| 日韩免费电影网站| 国产精品无人区| 亚洲一区二区三区中文字幕| 午夜精品福利久久久| 韩国欧美一区二区| 成人免费观看视频| 色一情一伦一子一伦一区| 色哟哟日韩精品| 欧美日韩国产另类不卡| 久久青草国产手机看片福利盒子| 国产农村妇女毛片精品久久麻豆 | 国产欧美一区二区在线观看| 欧美韩国日本不卡| 亚洲与欧洲av电影| 久久av中文字幕片| 99精品1区2区| 日韩欧美一区二区三区在线| 国产精品久久一级| 丝袜亚洲另类欧美综合| 国产成人午夜精品影院观看视频| 99精品视频免费在线观看| 欧美日韩国产123区| 国产亚洲欧美日韩日本| 亚洲福利视频一区二区| 国产精品99久久久久久宅男| 91搞黄在线观看| 久久久噜噜噜久噜久久综合| 亚洲欧美一区二区三区极速播放 | 欧美一区二区三区男人的天堂| 精品国产污污免费网站入口 | www.日本不卡| 欧美变态口味重另类| 亚洲蜜臀av乱码久久精品蜜桃| 日韩和的一区二区| 99久久99久久综合| 日韩免费观看高清完整版在线观看 | 成人av影院在线| 日韩一级黄色大片| 亚洲一区二区三区四区五区黄| 国产一区二区电影| 日韩午夜激情视频| 天堂午夜影视日韩欧美一区二区| 丁香啪啪综合成人亚洲小说| 91精品国产乱| 香蕉久久一区二区不卡无毒影院| 99国产精品久| 国产精品久久久久一区| 国产一区二区中文字幕| 日韩一级免费一区| 日韩精品福利网| 欧美性猛交xxxx乱大交退制版| 欧美激情在线一区二区| 国产制服丝袜一区| 欧美一级夜夜爽| 美腿丝袜亚洲三区| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲最大成人网4388xx| 成人不卡免费av| 国产精品久久久久久久蜜臀| 国产成人精品综合在线观看 | 日韩一区有码在线| 99国产欧美另类久久久精品| 国产精品免费观看视频| 大白屁股一区二区视频| 国产偷国产偷亚洲高清人白洁| 蜜臀av性久久久久av蜜臀妖精| 日韩一卡二卡三卡| 国产一区啦啦啦在线观看| 国产日韩欧美在线一区| 国产传媒一区在线| 中文字幕精品在线不卡| a在线欧美一区| 亚洲精品国产一区二区三区四区在线| 成人久久18免费网站麻豆| 中文字幕高清不卡| 色综合天天狠狠| 天堂资源在线中文精品| 欧美肥妇bbw| 精品一区中文字幕| 国产精品福利影院| 欧美午夜精品久久久久久超碰| 日本视频免费一区| 国产视频视频一区| 一本色道久久综合亚洲精品按摩| 亚州成人在线电影| 精品999久久久| av成人老司机| 日本成人在线视频网站| 国产日韩成人精品| 欧美午夜不卡视频| 国产精品自产自拍| 一区二区三区在线免费播放| 日韩精品一区二区在线观看| 国v精品久久久网| 五月天亚洲婷婷| 国产精品网站在线观看| 欧美日韩成人在线一区| 国产福利一区二区| 亚洲成人免费电影| 中文字幕免费在线观看视频一区| 欧美日韩一区二区三区视频| 狠狠色丁香九九婷婷综合五月| 亚洲嫩草精品久久| 久久一区二区三区四区| 91香蕉视频在线| 国产精一品亚洲二区在线视频| 亚洲欧美另类久久久精品2019| 欧美www视频| 欧美视频完全免费看| 国产91在线|亚洲| 日韩成人精品视频| 亚洲桃色在线一区| 国产欧美一区二区在线| 欧美一级一区二区| 日本道色综合久久| 岛国精品在线播放| 国产专区欧美精品| 麻豆国产精品一区二区三区| 一区二区久久久久久| 国产精品看片你懂得| 精品国产乱码久久久久久影片| 欧美三级日本三级少妇99| 91网站最新网址| 岛国精品在线观看| 国产在线精品一区二区不卡了| 石原莉奈一区二区三区在线观看| 亚洲精品国产一区二区精华液| 亚洲国产经典视频| 26uuu另类欧美亚洲曰本| 欧美高清dvd| 7777精品久久久大香线蕉 | 亚洲一区二区在线视频| 日韩一区在线免费观看| 中文字幕一区二区三区在线不卡 | 欧美日韩国产一二三| 欧美影院午夜播放| 欧美视频在线播放| 欧美日韩视频专区在线播放| 精品视频一区二区不卡| 欧美日韩极品在线观看一区| 欧美三级日韩在线| 911精品产国品一二三产区| 欧美日韩国产免费| 欧美一区日本一区韩国一区| 欧美一级免费大片| 欧美精品一区二区三区在线| 欧美精品一区二区三区一线天视频| 精品日韩欧美一区二区| 久久这里只有精品首页| 国产精品蜜臀在线观看| 中文字幕亚洲精品在线观看 | 欧美一区二区三区在| 欧美成人精品1314www| 国产亚洲综合性久久久影院| 日本一区二区久久| 综合分类小说区另类春色亚洲小说欧美| 国产精品免费av| 亚洲一区二区欧美日韩| 久久精品久久精品| 国产成人av电影在线| 91美女在线观看| 欧美日韩国产免费| 精品国产123| 中文字幕在线免费不卡| 午夜国产精品一区| 国产一区欧美日韩| 在线视频亚洲一区| 日韩一区二区精品在线观看| 国产精品久久久久三级| 亚洲制服丝袜av| 激情文学综合插| 色拍拍在线精品视频8848| 日韩精品最新网址| 亚洲精品国产视频| 蜜臀久久99精品久久久画质超高清| 成人动漫中文字幕| 日韩一区二区三区视频在线 | 国产清纯在线一区二区www| 亚洲夂夂婷婷色拍ww47| 国产在线不卡一卡二卡三卡四卡| 97精品久久久午夜一区二区三区| 欧美一区午夜精品| 亚洲视频 欧洲视频| 韩日av一区二区| 欧美日韩国产精选| 亚洲欧美日韩一区| 风间由美性色一区二区三区| 日韩午夜精品电影|