人工智能學(xué)習(xí)PyTorch教程之層和塊
對于多層感知機(jī)而言,整個模型做的事情就是接收輸入生成輸出。但是并不是所有的多層神經(jīng)網(wǎng)絡(luò)都一樣,所以為了實(shí)現(xiàn)復(fù)雜的神經(jīng)網(wǎng)絡(luò)就需要神經(jīng)網(wǎng)絡(luò)塊,塊可以描述單個層、由多個層組成的組件或整個模型本身。使用塊進(jìn)行抽象的一個好處是可以將一些塊組合成更大的組件。
從編程的角度來看,塊由類(class)表示。它的任何子類都必須定義一個將其輸入轉(zhuǎn)換為輸出的正向傳播函數(shù),并且必須存儲任何必需的參數(shù)。注意,有些塊不需要任何參數(shù)。最后,為了計(jì)算梯度,塊必須具有反向傳播函數(shù)。幸運(yùn)的是,在定義我們自己的塊時,由于autograd 中引入)提供了一些后端實(shí)現(xiàn),我們只需要考慮正向傳播函數(shù)和必需的參數(shù)。
這一部分我們就要自定義自己的層和塊。
先用實(shí)現(xiàn)一個簡單的多層感知機(jī):
import torch from torch import nn from torch.nn import functional as F net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) X = torch.rand(2, 20) net(X)
這個多層感知機(jī)包含一個具有256個單元和ReLU激活函數(shù)的全連接的隱藏層,然后是一個具有10個隱藏單元且不帶激活函數(shù)的全連接的輸出層。
通過實(shí)例化nn.Sequential來構(gòu)建我們的模型,層的執(zhí)行順序就是傳入?yún)?shù)的順序。
- nn.Sequential定義了一種特殊的Module,即在PyTorch中表示一個塊的類。它維護(hù)了一個由Module組成的有序列表(Linear類是Module的子類)。
- 正向傳播(forward)函數(shù):將列表中的每個塊連接在一起,將每個塊的輸出作為下一個塊的輸入。
- 通過net(X)調(diào)用我們的模型來獲得模型的輸出。是net.__call__(X)的簡寫。(這一句先不管他有什么,繼續(xù)往下看。)
我們也可以自己手寫一個多層感知機(jī):
class MLP(nn.Module): def __init__(self): # 調(diào)用`MLP`的父類的構(gòu)造函數(shù)來執(zhí)行必要的初始化。 # 這樣,在類實(shí)例化時也可以指定其他函數(shù)參數(shù),例如模型參數(shù)`params`(稍后將介紹) super().__init__() self.hidden = nn.Linear(20, 256) # 隱藏層 self.out = nn.Linear(256, 10) # 輸出層 # 定義模型的正向傳播,即如何根據(jù)輸入`X`返回所需的模型輸出 def forward(self, X): # 注意,這里我們使用ReLU的函數(shù)版本,其在nn.functional模塊中定義。 return self.out(F.relu(self.hidden(X))) net = MLP() net(X)
通過super().__init__()調(diào)用父類的__init__函數(shù),省去了重復(fù)編寫適用于大多數(shù)塊的模版代碼的痛苦。
實(shí)例化兩個全連接層,分別為self.hidden和self.out。
除非我們實(shí)現(xiàn)一個新的運(yùn)算符,否則我們不用擔(dān)心反向傳播函數(shù)或參數(shù)初始化,系統(tǒng)將自動生成這些。
前邊說調(diào)用net() 就相當(dāng)于調(diào)用net.__call__(X),因?yàn)槲覀冊谧约旱腗LP中寫了forward,但是我們沒有調(diào)用,只使用net() 他就自動執(zhí)行forward了。就是因?yàn)闀詣诱{(diào)用.__call__函數(shù)使forward執(zhí)行。
說完后兩條說第一條:
有序是怎么實(shí)現(xiàn)的,構(gòu)建構(gòu)一個簡化的MySequential:
class MySequential(nn.Module): def __init__(self, *args): super().__init__() for block in args: # 這里,`block`是`Module`子類的一個實(shí)例。我們把它保存在'Module'類的成員變量 # `_modules` 中。`block`的類型是OrderedDict。 self._modules[block] = block def forward(self, X): # OrderedDict保證了按照成員添加的順序遍歷它們 for block in self._modules.values(): X = block(X) return X
MySequential類提供了與默認(rèn)Sequential類相同的功能。
net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) net(X)
用MySequential類實(shí)現(xiàn)的多層感知機(jī)和Sequential類實(shí)現(xiàn)的一樣。
注意這里只是寫出了其執(zhí)行順序,是簡化版的Sequential類!
到此這篇關(guān)于人工智能學(xué)習(xí)PyTorch教程之層和塊的文章就介紹到這了,更多相關(guān)PyTorch 層和塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python獲取Linux下文件版本信息、公司名和產(chǎn)品名的方法
這篇文章主要介紹了python獲取Linux下文件版本信息、公司名和產(chǎn)品名的方法,主要涉及了pefile模塊的用法,需要的朋友可以參考下2014-10-10Python讀取hdf文件并轉(zhuǎn)化為tiff格式輸出
這篇文章主要介紹了Python讀取hdf文件并轉(zhuǎn)化為tiff格式輸出,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07