前言:
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:
- 卷積層-Conv2d
- 全連接層
- 池化層
- Dropout
- 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: