PyTorch簡明筆記[3]-神經(jīng)網(wǎng)絡的基本組件(Layers派撕、functions)

前言:

PyTorch的torch.nn中包含了各種神經(jīng)網(wǎng)絡層、激活函數(shù)荠卷、損失函數(shù)等等的類。我們通過torch.nn來創(chuàng)建對象烛愧,搭建網(wǎng)絡油宜。
PyTorch中還有torch.nn.functional,讓我們可以通過調(diào)用函數(shù)的方式怜姿,來直接搭建網(wǎng)絡慎冤,而不用像torch.nn一樣要先創(chuàng)建對象。

我們可以按照自己的習慣沧卢,結(jié)合上面兩種方法蚁堤,來搭建網(wǎng)絡。
一般情況下但狭,對于像Conv層這種需要定義多個參數(shù)的時候披诗,我們采用torch.nn的方式比較方便,而對于參數(shù)比較少的立磁,或者不用設置參數(shù)的呈队,尤其是一些函數(shù),我們就可以采用torch.nn.functional來定義唱歧。一般我們import torch.nn.functional as F宪摧,這樣后面寫起來方便一些。

torch.nn.Module是所有神經(jīng)網(wǎng)絡模型的基本類(basic class)迈喉,所有的模型都應該是它的子類绍刮。

定義模型的方法如下(只是一種形式):

# 神經(jīng)網(wǎng)絡模型包:
import torch.nn as nn
# 神經(jīng)網(wǎng)絡中的各種函數(shù)包:
import torch.nn.functional as F

# 繼承nn.Module
class Model(nn.Module): 
    def __init__(self):
        # 調(diào)用nn.Module的初始化方法
        super(Model, self).__init__()
        # 添加該模型的自定義初始化(主要是定義神經(jīng)網(wǎng)絡層)
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)
    
    # 定義模式的輸出是怎么計算的
    #(主要寫各層之間通過什么激活函數(shù)、池化等等來連接)
    def forward(self, x):
       x = F.relu(self.conv1(x))
       return F.relu(self.conv2(x))

通過上面的方式定義了模型類之后挨摸,我們就可以使用nn.Module內(nèi)置的.parameters()方法來獲取模型的參數(shù)。我們后面要更新的就是這些參數(shù)岁歉。


一得运、常用的神經(jīng)網(wǎng)絡層

這里,我們介紹以下幾種layers:

  1. 卷積層-Conv2d
  2. 全連接層
  3. 池化層
  4. Dropout
  5. BatchNorm

1.卷積層(2D)

CLASS
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

  • 注意是個類锅移,要創(chuàng)建對象后再使用熔掺。
  • 參數(shù)中的kernel_size, stride, padding, dilation的值,可以為int非剃,也可以為tuple置逻。是int的時候,就代表長寬相等备绽。
  • Input size為(N,C_in?,H,W)券坞;
    Output size為(N,C_out?,H_out?,W_out?).
    其中鬓催,N為batch size,即樣本數(shù)恨锚,C為channel數(shù)宇驾,H為height,W為width猴伶。

舉例:


2.全連接層/線性層

采用CLASS方式
torch.nn.Linear(in_features, out_features, bias=True)

  • Input size = (N,?,in_features)
    Output size = (N,?,out_features)
    舉例:


3.Pooling(2D)層

采用CLASS方式
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
舉例:


采用Function方式:(似乎更簡潔)
F.avg_pool2d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True) → Tensor

4.Dropout 層

CLASS
torch.nn.Dropout(p=0.5, inplace=False)
torch.nn.Dropout2d(p=0.5, inplace=False)

  • 前者通常接受來自nn.Linear的數(shù)據(jù)
  • 后者通常接受來自nn.Conv2d的數(shù)據(jù)

舉例:


5.BatchNorm(2D)

CLASS
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

BN層的主要作用是课舍,通過對數(shù)據(jù)進行標準化,來加速神經(jīng)網(wǎng)絡的訓練他挎。
唯一必須設置的參數(shù)num_features 要等于輸入數(shù)據(jù)(N,C,H,W)中的C筝尾,就是Channel數(shù)。


二办桨、常用的激活函數(shù)

采用CLASS方式:
torch.nn.ReLU(inplace=False)
torch.nn.Sigmoid
torch.nn.Tanh
torch.nn.Softmax(dim=None)

這些很簡單忿等,就不解釋了。舉例:


采用Function方式(更簡潔):

三崔挖、損失函數(shù)

MSE
torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
Cross-Entropy
torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

用法也很簡單贸街,把預測值(input)和標簽值(target)扔進去就行:


這里對Cross-entropy的使用有一點需要注意的地方:

從文檔可以看到,這個Target(即label)的值有限制狸相,值的大小需要再[0,C-1]之間薛匪。
比如,我們有5個類別脓鹃,C=5逸尖,那么你給的標簽值必須在[0,4]之間,不能取其他的數(shù)字瘸右。


上面的內(nèi)容列舉了最常見的一些layers和functions娇跟。我在舉例子的時候,主要是采用torch.nn定義Class的方式太颤,無論是layer還是函數(shù)苞俘,都是先創(chuàng)建對象,在用對象去進行操作龄章。上面寫的每一個吃谣,其實在torch.nn.functional中都有對應,使用起來相當于省掉了創(chuàng)建對象那一步做裙,所以就不贅述了岗憋。

下一篇筆記記錄如何使用上面的這些組件,去搭建神經(jīng)網(wǎng)絡锚贱,做一個圖片分類模型仔戈。


歡迎關(guān)注我的簡書專題
DeepLearning筆記
不妨來我的知乎專欄逛逛吧:
DeepLearning學習筆記
更精美的文章,歡迎關(guān)注我的微信公眾平臺 SimpleAI

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市监徘,隨后出現(xiàn)的幾起案子晋修,更是在濱河造成了極大的恐慌,老刑警劉巖耐量,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞蚓,死亡現(xiàn)場離奇詭異,居然都是意外死亡廊蜒,警方通過查閱死者的電腦和手機趴拧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來山叮,“玉大人著榴,你說我怎么就攤上這事∑ň螅” “怎么了脑又?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锐借。 經(jīng)常有香客問我问麸,道長,這世上最難降的妖魔是什么钞翔? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任严卖,我火速辦了婚禮,結(jié)果婚禮上布轿,老公的妹妹穿的比我還像新娘哮笆。我一直安慰自己,他們只是感情好汰扭,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布稠肘。 她就那樣靜靜地躺著,像睡著了一般萝毛。 火紅的嫁衣襯著肌膚如雪项阴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天珊泳,我揣著相機與錄音鲁冯,去河邊找鬼。 笑死色查,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撞芍。 我是一名探鬼主播秧了,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼序无!你這毒婦竟也來了验毡?” 一聲冷哼從身側(cè)響起衡创,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晶通,沒想到半個月后璃氢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狮辽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年一也,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喉脖。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡椰苟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出树叽,到底是詐尸還是另有隱情舆蝴,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布题诵,位于F島的核電站洁仗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏性锭。R本人自食惡果不足惜赠潦,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篷店。 院中可真熱鬧祭椰,春花似錦、人聲如沸疲陕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹄殃。三九已至携茂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诅岩,已是汗流浹背讳苦。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吩谦,地道東北人鸳谜。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像式廷,于是被迫代替她去往敵國和親咐扭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容