人工智能學習PyTorch教程之層和塊
對於多層感知機而言,整個模型做的事情就是接收輸入生成輸出。但是並不是所有的多層神經網絡都一樣,所以為瞭實現復雜的神經網絡就需要神經網絡塊,塊可以描述單個層、由多個層組成的組件或整個模型本身。使用塊進行抽象的一個好處是可以將一些塊組合成更大的組件。
從編程的角度來看,塊由類(class)表示。它的任何子類都必須定義一個將其輸入轉換為輸出的正向傳播函數,並且必須存儲任何必需的參數。註意,有些塊不需要任何參數。最後,為瞭計算梯度,塊必須具有反向傳播函數。幸運的是,在定義我們自己的塊時,由於autograd 中引入)提供瞭一些後端實現,我們隻需要考慮正向傳播函數和必需的參數。
這一部分我們就要自定義自己的層和塊。
先用實現一個簡單的多層感知機:
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)
這個多層感知機包含一個具有256個單元和ReLU激活函數的全連接的隱藏層,然後是一個具有10個隱藏單元且不帶激活函數的全連接的輸出層。
通過實例化nn.Sequential來構建我們的模型,層的執行順序就是傳入參數的順序。
- nn.Sequential定義瞭一種特殊的Module,即在PyTorch中表示一個塊的類。它維護瞭一個由Module組成的有序列表(Linear類是Module的子類)。
- 正向傳播(forward)函數:將列表中的每個塊連接在一起,將每個塊的輸出作為下一個塊的輸入。
- 通過net(X)調用我們的模型來獲得模型的輸出。是net.__call__(X)的簡寫。(這一句先不管他有什麼,繼續往下看。)
我們也可以自己手寫一個多層感知機:
class MLP(nn.Module): def __init__(self): # 調用`MLP`的父類的構造函數來執行必要的初始化。 # 這樣,在類實例化時也可以指定其他函數參數,例如模型參數`params`(稍後將介紹) super().__init__() self.hidden = nn.Linear(20, 256) # 隱藏層 self.out = nn.Linear(256, 10) # 輸出層 # 定義模型的正向傳播,即如何根據輸入`X`返回所需的模型輸出 def forward(self, X): # 註意,這裡我們使用ReLU的函數版本,其在nn.functional模塊中定義。 return self.out(F.relu(self.hidden(X))) net = MLP() net(X)
通過super().__init__()調用父類的__init__函數,省去瞭重復編寫適用於大多數塊的模版代碼的痛苦。
實例化兩個全連接層,分別為self.hidden和self.out。
除非我們實現一個新的運算符,否則我們不用擔心反向傳播函數或參數初始化,系統將自動生成這些。
前邊說調用net() 就相當於調用net.__call__(X),因為我們在自己的MLP中寫瞭forward,但是我們沒有調用,隻使用net() 他就自動執行forward瞭。就是因為會自動調用.__call__函數使forward執行。
說完後兩條說第一條:
有序是怎麼實現的,構建構一個簡化的MySequential:
class MySequential(nn.Module): def __init__(self, *args): super().__init__() for block in args: # 這裡,`block`是`Module`子類的一個實例。我們把它保存在'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類提供瞭與默認Sequential類相同的功能。
net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) net(X)
用MySequential類實現的多層感知機和Sequential類實現的一樣。
註意這裡隻是寫出瞭其執行順序,是簡化版的Sequential類!
到此這篇關於人工智能學習PyTorch教程之層和塊的文章就介紹到這瞭,更多相關PyTorch 層和塊內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Pytorch中如何調用forward()函數
- PyTorch零基礎入門之構建模型基礎
- 淺談Pytorch 定義的網絡結構層能否重復使用
- Python LeNet網絡詳解及pytorch實現
- pytorch中的hook機制register_forward_hook