首頁 > 軟體

人工智慧學習PyTorch教學之層和塊

2021-11-25 19:01:32

對於多層感知機而言,整個模型做的事情就是接收輸入生成輸出。但是並不是所有的多層神經網路都一樣,所以為了實現複雜的神經網路就需要神經網路塊,塊可以描述單個層、由多個層組成的元件或整個模型本身。使用塊進行抽象的一個好處是可以將一些塊組合成更大的元件。

從程式設計的角度來看,塊由類(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 層和塊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com