婷婷综合国产,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
    成人国产一区二区三区精品| 久久久久久久电影| 亚洲人成小说网站色在线| 欧美高清视频一二三区| 99精品久久免费看蜜臀剧情介绍 | 亚洲欧洲色图综合| 欧美mv日韩mv国产网站| 欧美一区二区三区成人| 欧美三级资源在线| 日本高清不卡在线观看| 波多野结衣亚洲一区| 丁香六月综合激情| 国产传媒一区在线| 久久精品国产澳门| 国产一区二区主播在线| 国内精品伊人久久久久av一坑| 美女久久久精品| 麻豆精品蜜桃视频网站| 日本成人超碰在线观看| 蜜臀99久久精品久久久久久软件| 首页国产欧美日韩丝袜| 日韩va亚洲va欧美va久久| 蜜臀国产一区二区三区在线播放| 久久精品国产精品亚洲精品| 裸体歌舞表演一区二区| 国产美女精品在线| 粉嫩久久99精品久久久久久夜| 国产麻豆午夜三级精品| 成人免费毛片嘿嘿连载视频| 91亚洲永久精品| 欧美日韩成人综合天天影院| 欧美日韩精品一区二区三区蜜桃 | 色婷婷久久一区二区三区麻豆| 99re视频这里只有精品| 91蜜桃视频在线| 欧美日韩一二区| 欧美一区二区三区视频免费播放 | 欧美成va人片在线观看| 久久精品亚洲国产奇米99| 国产精品麻豆欧美日韩ww| 亚洲天堂精品视频| 午夜精品成人在线| 毛片av一区二区三区| 国产一区二区女| 91丨九色丨国产丨porny| 欧美中文字幕亚洲一区二区va在线| 欧美在线制服丝袜| 精品免费99久久| 亚洲色图20p| 日本欧美在线观看| 成人午夜看片网址| 欧美猛男男办公室激情| 国产亚洲午夜高清国产拍精品| 欧美日韩国产三级| 欧美韩日一区二区三区四区| 亚洲在线中文字幕| 国产黄色91视频| 欧美影视一区在线| www国产精品av| 一区二区三区不卡在线观看| 激情偷乱视频一区二区三区| 色网站国产精品| 国产三级欧美三级日产三级99| 综合色中文字幕| 精品一区二区三区香蕉蜜桃| www.久久精品| 久久久一区二区三区捆绑**| 亚洲一二三专区| www.日韩大片| 国产欧美日韩精品一区| 美国十次综合导航| 日本乱人伦aⅴ精品| 国产亚洲婷婷免费| 奇米色一区二区| 欧美唯美清纯偷拍| 中文字幕中文乱码欧美一区二区| 老司机精品视频一区二区三区| 一本到不卡精品视频在线观看 | 国产精品久久久久久久久果冻传媒| 五月婷婷久久丁香| 色综合色综合色综合| 日本一区二区在线不卡| 国产剧情一区二区| 精品国产免费久久| 毛片av一区二区| 日韩欧美国产电影| 免费成人av资源网| 日韩免费观看高清完整版| 麻豆中文一区二区| 精品国产一区二区三区四区四| 日韩国产精品大片| 欧美一区二区三区免费在线看| 亚洲一区二区视频在线观看| 欧美私人免费视频| 亚洲成人午夜电影| 欧美日本在线一区| 日日骚欧美日韩| 欧美一区二视频| 九九精品一区二区| 国产区在线观看成人精品| 国产一区二区h| 欧美国产97人人爽人人喊| 成人深夜福利app| 亚洲日本电影在线| 欧美日本在线一区| 裸体一区二区三区| 久久久久久久久久久久久女国产乱| 国产一区91精品张津瑜| 国产精品久久久久久亚洲毛片 | 免费一级欧美片在线观看| 91精品国产高清一区二区三区| 日韩精品一级中文字幕精品视频免费观看| 欧美三级韩国三级日本三斤 | 亚洲高清免费观看| 欧美精品精品一区| 国产综合色产在线精品| 中文字幕成人av| 色一区在线观看| 免费成人结看片| 国产精品久久久久久久久快鸭| 91传媒视频在线播放| 免费在线观看不卡| 国产欧美精品一区二区色综合| 91片黄在线观看| 六月婷婷色综合| 亚洲欧美电影院| 精品久久久影院| 91丨porny丨蝌蚪视频| 日韩国产成人精品| 中文字幕亚洲一区二区av在线| 欧美三级在线看| 国产精品一区二区黑丝 | 精品一区二区三区影院在线午夜| 中文字幕不卡在线| 欧美一级欧美三级| 一本大道综合伊人精品热热 | 色婷婷亚洲婷婷| 久久精品99国产精品| 中文字幕中文字幕中文字幕亚洲无线| 在线免费精品视频| 国产成人免费视频网站| 亚洲国产精品精华液网站| 国产欧美一区二区三区在线看蜜臀| 欧美亚洲国产怡红院影院| 国产乱人伦精品一区二区在线观看| 亚洲国产精品视频| 中文字幕中文在线不卡住| 欧美一二三区精品| 欧美性色综合网| 91网址在线看| 成人性生交大片免费看视频在线| 秋霞午夜鲁丝一区二区老狼| 亚洲狠狠丁香婷婷综合久久久| 中文字幕欧美日本乱码一线二线| 日韩精品一区二区三区四区| 欧美色图在线观看| 91视视频在线观看入口直接观看www | 91久久精品网| 国产成人啪午夜精品网站男同| 午夜久久福利影院| 亚洲男同性视频| 中文字幕免费一区| 26uuu亚洲婷婷狠狠天堂| 91精品国产色综合久久| 欧美日韩国产综合草草| 欧美色中文字幕| 欧美在线观看18| 99国产精品国产精品久久| 国产资源在线一区| 久久精品久久综合| 久久99精品久久久久久动态图 | 日韩一级免费观看| 欧美日本一区二区三区| 欧美日韩一区二区欧美激情| 色综合久久88色综合天天免费| 成人亚洲精品久久久久软件| 国产精品一区二区三区乱码| 国产精品77777| 国产91精品一区二区麻豆网站 | 91久久人澡人人添人人爽欧美| 不卡av在线免费观看| 99久久久国产精品| 91在线观看高清| 色88888久久久久久影院按摩| 99精品视频免费在线观看| 色婷婷久久久亚洲一区二区三区| 色欧美片视频在线观看在线视频| 色乱码一区二区三区88| 色www精品视频在线观看| 一本一道久久a久久精品| 在线欧美一区二区| 日韩欧美一区二区免费| 欧美成人一区二区三区在线观看| 欧美一级黄色录像| 国产女同互慰高潮91漫画| 中文字幕亚洲视频| 天堂影院一区二区| 麻豆精品新av中文字幕| 国产成人av一区二区| 不卡视频一二三|