最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyTorch中的參數(shù)類torch.nn.Parameter()詳解

 更新時間:2022年02月24日 09:40:18   作者:Adenialzz  
這篇文章主要給大家介紹了關于PyTorch中torch.nn.Parameter()的相關資料,要內(nèi)容包括基礎應用、實用技巧、原理機制等方面,文章通過實例介紹的非常詳細,需要的朋友可以參考下

前言

今天來聊一下PyTorch中的torch.nn.Parameter()這個函數(shù),筆者第一次見的時候也是大概能理解函數(shù)的用途,但是具體實現(xiàn)原理細節(jié)也是云里霧里,在參考了幾篇博文,做過幾個實驗之后算是清晰了,本文在記錄的同時希望給后來人一個參考,歡迎留言討論。

分析

先看其名,parameter,中文意為參數(shù)。我們知道,使用PyTorch訓練神經(jīng)網(wǎng)絡時,本質(zhì)上就是訓練一個函數(shù),這個函數(shù)輸入一個數(shù)據(jù)(如CV中輸入一張圖像),輸出一個預測(如輸出這張圖像中的物體是屬于什么類別)。而在我們給定這個函數(shù)的結(jié)構(gòu)(如卷積、全連接等)之后,能學習的就是這個函數(shù)的參數(shù)了,我們設計一個損失函數(shù),配合梯度下降法,使得我們學習到的函數(shù)(神經(jīng)網(wǎng)絡)能夠盡量準確地完成預測任務。

通常,我們的參數(shù)都是一些常見的結(jié)構(gòu)(卷積、全連接等)里面的計算參數(shù)。而當我們的網(wǎng)絡有一些其他的設計時,會需要一些額外的參數(shù)同樣很著整個網(wǎng)絡的訓練進行學習更新,最后得到最優(yōu)的值,經(jīng)典的例子有注意力機制中的權(quán)重參數(shù)、Vision Transformer中的class token和positional embedding等。

而這里的torch.nn.Parameter()就可以很好地適應這種應用場景。

下面是這篇博客的一個總結(jié),筆者認為講的比較明白,在這里引用一下:

首先可以把這個函數(shù)理解為類型轉(zhuǎn)換函數(shù),將一個不可訓練的類型Tensor轉(zhuǎn)換成可以訓練的類型parameter并將這個parameter綁定到這個module里面(net.parameter()中就有這個綁定的parameter,所以在參數(shù)優(yōu)化的時候可以進行優(yōu)化的),所以經(jīng)過類型轉(zhuǎn)換這個self.v變成了模型的一部分,成為了模型中根據(jù)訓練可以改動的參數(shù)了。使用這個函數(shù)的目的也是想讓某些變量在學習的過程中不斷的修改其值以達到最優(yōu)化。

ViT中nn.Parameter()的實驗

看過這個分析后,我們再看一下Vision Transformer中的用法:

...

self.pos_embedding = nn.Parameter(torch.randn(1, num_patches+1, dim))
self.cls_token = nn.Parameter(torch.randn(1, 1, dim))
...

我們知道在ViT中,positonal embedding和class token是兩個需要隨著網(wǎng)絡訓練學習的參數(shù),但是它們又不屬于FC、MLP、MSA等運算的參數(shù),在這時,就可以用nn.Parameter()來將這個隨機初始化的Tensor注冊為可學習的參數(shù)Parameter。

為了確定這兩個參數(shù)確實是被添加到了net.Parameters()內(nèi),筆者稍微改動源碼,顯式地指定這兩個參數(shù)的初始數(shù)值為0.98,并打印迭代器net.Parameters()。

...

self.pos_embedding = nn.Parameter(torch.ones(1, num_patches+1, dim) * 0.98)
self.cls_token = nn.Parameter(torch.ones(1, 1, dim) * 0.98)
...

實例化一個ViT模型并打印net.Parameters():

net_vit = ViT(
        image_size = 256,
        patch_size = 32,
        num_classes = 1000,
        dim = 1024,
        depth = 6,
        heads = 16,
        mlp_dim = 2048,
        dropout = 0.1,
        emb_dropout = 0.1
    )

for para in net_vit.parameters():
        print(para.data)

輸出結(jié)果中可以看到,最前兩行就是我們顯式指定為0.98的兩個參數(shù)pos_embedding和cls_token:

tensor([[[0.9800, 0.9800, 0.9800,  ..., 0.9800, 0.9800, 0.9800],
         [0.9800, 0.9800, 0.9800,  ..., 0.9800, 0.9800, 0.9800],
         [0.9800, 0.9800, 0.9800,  ..., 0.9800, 0.9800, 0.9800],
         ...,
         [0.9800, 0.9800, 0.9800,  ..., 0.9800, 0.9800, 0.9800],
         [0.9800, 0.9800, 0.9800,  ..., 0.9800, 0.9800, 0.9800],
         [0.9800, 0.9800, 0.9800,  ..., 0.9800, 0.9800, 0.9800]]])
tensor([[[0.9800, 0.9800, 0.9800,  ..., 0.9800, 0.9800, 0.9800]]])
tensor([[-0.0026, -0.0064,  0.0111,  ...,  0.0091, -0.0041, -0.0060],
        [ 0.0003,  0.0115,  0.0059,  ..., -0.0052, -0.0056,  0.0010],
        [ 0.0079,  0.0016, -0.0094,  ...,  0.0174,  0.0065,  0.0001],
        ...,
        [-0.0110, -0.0137,  0.0102,  ...,  0.0145, -0.0105, -0.0167],
        [-0.0116, -0.0147,  0.0030,  ...,  0.0087,  0.0022,  0.0108],
        [-0.0079,  0.0033, -0.0087,  ..., -0.0174,  0.0103,  0.0021]])
...
...

這就可以確定nn.Parameter()添加的參數(shù)確實是被添加到了Parameters列表中,會被送入優(yōu)化器中隨訓練一起學習更新。

from torch.optim import Adam
opt = Adam(net_vit.parameters(), learning_rate=0.001)

其他解釋

以下是國外StackOverflow的一個大佬的解讀,筆者自行翻譯并放在這里供大家參考,想查看原文的同學請戳這里。

我們知道Tensor相當于是一個高維度的矩陣,它是Variable類的子類。Variable和Parameter之間的差異體現(xiàn)在與Module關聯(lián)時。當Parameter作為model的屬性與module相關聯(lián)時,它會被自動添加到Parameters列表中,并且可以使用net.Parameters()迭代器進行訪問。

最初在Torch中,一個Variable(例如可以是某個中間state)也會在賦值時被添加為模型的Parameter。在某些實例中,需要緩存變量,而不是將它們添加到Parameters列表中。

文檔中提到的一種情況是RNN,在這種情況下,您需要保存最后一個hidden state,這樣就不必一次又一次地傳遞它。需要緩存一個Variable,而不是讓它自動注冊為模型的Parameter,這就是為什么我們有一個顯式的方法將參數(shù)注冊到我們的模型,即nn.Parameter類。

舉個例子:

import torch
import torch.nn as nn
from torch.optim import Adam

class NN_Network(nn.Module):
    def __init__(self,in_dim,hid,out_dim):
        super(NN_Network, self).__init__()
        self.linear1 = nn.Linear(in_dim,hid)
        self.linear2 = nn.Linear(hid,out_dim)
        self.linear1.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
        self.linear1.bias = torch.nn.Parameter(torch.ones(hid))
        self.linear2.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
        self.linear2.bias = torch.nn.Parameter(torch.ones(hid))

    def forward(self, input_array):
        h = self.linear1(input_array)
        y_pred = self.linear2(h)
        return y_pred

in_d = 5
hidn = 2
out_d = 3
net = NN_Network(in_d, hidn, out_d)

然后檢查一下這個模型的Parameters列表:

for param in net.parameters():
    print(type(param.data), param.size())

""" Output
<class 'torch.FloatTensor'> torch.Size([5, 2])
<class 'torch.FloatTensor'> torch.Size([2])
<class 'torch.FloatTensor'> torch.Size([5, 2])
<class 'torch.FloatTensor'> torch.Size([2])
"""

可以輕易地送入到優(yōu)化器中:

opt = Adam(net.parameters(), learning_rate=0.001)

另外,請注意Parameter的require_grad會自動設定。

各位讀者有疑惑或異議的地方,歡迎留言討論。

參考:

http://m.fzitv.net/article/238632.htm

https://stackoverflow.com/questions/50935345/understanding-torch-nn-parameter

總結(jié)

到此這篇關于PyTorch中torch.nn.Parameter()的文章就介紹到這了,更多相關PyTorch中torch.nn.Parameter()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于yolov5的一些簡單說明(txt文件、訓練結(jié)果分析等)

    關于yolov5的一些簡單說明(txt文件、訓練結(jié)果分析等)

    使用YOLOV5訓練數(shù)據(jù)之后我們需要一些評判標準來告訴我們所訓練的效果究竟如何,下面這篇文章主要給大家介紹了關于yolov5的一些簡單說明,主要是txt文件、訓練結(jié)果分析等的相關資料,需要的朋友可以參考下
    2022-06-06
  • python機器學習高數(shù)篇之泰勒公式

    python機器學習高數(shù)篇之泰勒公式

    這篇文章主要介紹了python機器學習高數(shù)篇之函數(shù)極限和導數(shù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Linux添加Python?path方法及修改環(huán)境變量的三種方法

    Linux添加Python?path方法及修改環(huán)境變量的三種方法

    這篇文章主要介紹了Linux添加Python?path方法及修改環(huán)境變量的三種方法,Linux 下設置環(huán)境變量有三種方法,一種用于當前終端,一種用于當前用戶,一種用于所有用戶,本文對每種方法給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • tensorflow之并行讀入數(shù)據(jù)詳解

    tensorflow之并行讀入數(shù)據(jù)詳解

    今天小編就為大家分享一篇tensorflow之并行讀入數(shù)據(jù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python yield 小結(jié)和實例

    Python yield 小結(jié)和實例

    yield的作用就是把一個函數(shù)變成一個 generator,帶有 yield 的函數(shù)不再是一個普通函數(shù),Python 解釋器會將其視為一個 generator(不知道什么是generator要先去理解一下Python的generator的了)
    2014-04-04
  • Python+tkinter實現(xiàn)制作文章搜索軟件

    Python+tkinter實現(xiàn)制作文章搜索軟件

    無聊的時候做了一個搜索文章的軟件,有沒有更加的方便快捷不知道,好玩就行了。軟件是利用Python和tkinter實現(xiàn)的,感興趣的可以嘗試一下
    2022-10-10
  • VSCode Python開發(fā)環(huán)境配置的詳細步驟

    VSCode Python開發(fā)環(huán)境配置的詳細步驟

    這篇文章主要介紹了VSCode Python開發(fā)環(huán)境配置的詳細步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Python數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解

    Python數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解

    這篇文章主要為大家詳細介紹了Python數(shù)據(jù)結(jié)構(gòu)之單鏈表的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Python實現(xiàn)輕松識別數(shù)百個快遞單號

    Python實現(xiàn)輕松識別數(shù)百個快遞單號

    當我們要寄出很多快遞時,為了及時反饋物流信息,需要盡快將快遞單號提取出來。這時用手動去識別真的太麻煩,所以本文將用Python實現(xiàn)輕松識別數(shù)百個快遞單號,需要的可以參考一下
    2022-06-06
  • Python實現(xiàn).gif圖片拆分為.png圖片的簡單示例

    Python實現(xiàn).gif圖片拆分為.png圖片的簡單示例

    有時候需要把GIF圖片分解成一張一張的靜態(tài)圖,jpg或者png格式,下面這篇文章主要給大家介紹了關于Python實現(xiàn).gif圖片拆分為.png圖片的相關資料,需要的朋友可以參考下
    2023-01-01

最新評論

诸暨市| 上思县| 咸丰县| 汕头市| 武陟县| 高要市| 苗栗县| 邵东县| 汤原县| 元谋县| 泰州市| 胶州市| 县级市| 墨脱县| 朝阳市| 西吉县| 扶余县| 崇文区| 乐至县| 麟游县| 米林县| 昌都县| 汝南县| 神池县| 嘉黎县| 耒阳市| 手机| 衡山县| 新郑市| 华安县| 静乐县| 南充市| 德令哈市| 阿城市| 华坪县| 安新县| 工布江达县| 凤城市| 美姑县| 大丰市| 石柱|