一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 人工智能學習PyTorch教程之層和塊

人工智能學習PyTorch教程之層和塊

2022-03-08 00:13LolitaAnn Python

這篇文章主要為大家介紹了人工智能學習Pytorch教程中的層和塊的相關知識點,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

對于多層感知機而言,整個模型做的事情就是接收輸入生成輸出。但是并不是所有的多層神經(jīng)網(wǎng)絡都一樣,所以為了實現(xiàn)復雜的神經(jīng)網(wǎng)絡就需要神經(jīng)網(wǎng)絡塊,塊可以描述單個層、由多個層組成的組件或整個模型本身。使用塊進行抽象的一個好處是可以將一些塊組合成更大的組件。

人工智能學習PyTorch教程之層和塊

從編程的角度來看,塊由類(class)表示。它的任何子類都必須定義一個將其輸入轉換為輸出的正向傳播函數(shù),并且必須存儲任何必需的參數(shù)。注意,有些塊不需要任何參數(shù)。最后,為了計算梯度,塊必須具有反向傳播函數(shù)。幸運的是,在定義我們自己的塊時,由于autograd 中引入)提供了一些后端實現(xiàn),我們只需要考慮正向傳播函數(shù)和必需的參數(shù)。

這一部分我們就要自定義自己的層和塊。

先用實現(xiàn)一個簡單的多層感知機:

?
1
2
3
4
5
6
7
8
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激活函數(shù)的全連接的隱藏層,然后是一個具有10個隱藏單元且不帶激活函數(shù)的全連接的輸出層。

通過實例化nn.Sequential來構建我們的模型,層的執(zhí)行順序就是傳入?yún)?shù)的順序。

  • nn.Sequential定義了一種特殊的Module,即在PyTorch中表示一個塊的類。它維護了一個由Module組成的有序列表(Linear類是Module的子類)。
  • 正向傳播(forward)函數(shù):將列表中的每個塊連接在一起,將每個塊的輸出作為下一個塊的輸入。
  • 通過net(X)調(diào)用我們的模型來獲得模型的輸出。是net.__call__(X)的簡寫。(這一句先不管他有什么,繼續(xù)往下看。)

我們也可以自己手寫一個多層感知機:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MLP(nn.Module):
    def __init__(self):
        # 調(diào)用`MLP`的父類的構造函數(shù)來執(zhí)行必要的初始化。
        # 這樣,在類實例化時也可以指定其他函數(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ù),省去了重復編寫適用于大多數(shù)塊的模版代碼的痛苦。

實例化兩個全連接層,分別為self.hidden和self.out。

除非我們實現(xiàn)一個新的運算符,否則我們不用擔心反向傳播函數(shù)或參數(shù)初始化,系統(tǒng)將自動生成這些。

前邊說調(diào)用net() 就相當于調(diào)用net.__call__(X),因為我們在自己的MLP中寫了forward,但是我們沒有調(diào)用,只使用net() 他就自動執(zhí)行forward了。就是因為會自動調(diào)用.__call__函數(shù)使forward執(zhí)行。

說完后兩條說第一條:

人工智能學習PyTorch教程之層和塊

有序是怎么實現(xiàn)的,構建構一個簡化的MySequential:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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類相同的功能。

?
1
2
net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net(X)

用MySequential類實現(xiàn)的多層感知機和Sequential類實現(xiàn)的一樣。

注意這里只是寫出了其執(zhí)行順序,是簡化版的Sequential類!

到此這篇關于人工智能學習PyTorch教程之層和塊的文章就介紹到這了,更多相關PyTorch 層和塊內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.51cto.com/Lolitann/4682377

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产大神91一区二区三区 | 亚洲国产精品久久无套麻豆 | 精品无码国产污污污免费网站2 | 深夜视频在线播放 | 午夜片无码区在线观看 | 处女呦呦 | 久久精品免视看国产 | 99久久精品自在自看国产 | 四虎影视永久免费视频观看 | 色婷婷六月丁香在线观看 | 天堂在线免费观看 | 91视频www | 日韩在线观看网站 | 日本成日本片人免费 | 视频一区二区三区在线 | 十大网站免费货源 | 日本无遮挡吸乳视频看看 | 亚洲欧美韩国日产综合在线 | julia ann多人乱战| 国产99视频精品免视看7 | 暖暖 免费 高清 日本 在线 | 国产日韩精品一区二区在线观看 | 国产精品www | gayrb漫画免费入口 | 日本成熟| 久久热在线视频精品1 | 香港三级系列在线播放 | 亚欧视频在线观看 | 手机在线免费观看高清 | 和日本免费不卡在线v | 欧美成人精品福利在线视频 | 国产婷婷综合丁香亚洲欧洲 | 国产精品 视频一区 二区三区 | voyeur多毛厕所 | 精品日韩视频 | 每天都要睡男人(nph) | 性一交一无一伦一精一品 | 青青青视频免费观看 | 欧美艳星kagney1ynn | 国产福利片在线 | 亚洲天堂中文 |