PyTorch 笔记(16)— torch.nn.Sequential、torch.nn.Linear、torch.nn.RelU
PyTorch 中的 torch.nn 包提供了很多與實現(xiàn)神經(jīng)網(wǎng)絡中的具體功能相關的類,這些類涵蓋了深度神經(jīng)網(wǎng)絡模型在搭建和參數(shù)優(yōu)化過程中的常用內(nèi)容,比如神經(jīng)網(wǎng)絡中的卷積層、池化層、全連接層這類層次構造的方法、防止過擬合的參數(shù)歸一化方法、Dropout 方法,還有激活函數(shù)部分的線性激活函數(shù)、非線性激活函數(shù)相關的方法,等等。
下面使用 PyTorch 的 torch.nn 包來簡化我們之前的代碼,開始部分的代碼變化不大,如下所示:
import torch as tbatch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)
這里僅定義了輸入和輸出的變量,之前定義神經(jīng)網(wǎng)絡模型中的權重參數(shù)的代碼被刪減了,這和我們之后在代碼中使用的 torch.nn 包中的類有關,因為這個類能夠幫助我們自動生成和初始化對應維度的權重參數(shù)。模型搭建的代碼如下:
models = t.nn.Sequential(t.nn.Linear(input_data, hidden_layer),t.nn.ReLU(),t.nn.Linear(hidden_layer, output_data))
torch.nn.Sequential 括號內(nèi)的內(nèi)容就是我們搭建的神經(jīng)網(wǎng)絡模型的具體結: *
torch.nn.Linear(input_data,hidden_layer)完成從輸入層到隱藏層的線性變換;torch.nn.ReLU()為激活函數(shù);torch.nn.Linear(hidden_layer, output_data)完成從隱藏層到輸出層的線性變換;
下面分別對在以上代碼中使用的 torch.nn.Sequential 、torch.nn.Linear 和 torch.nn.RelU 這三個類進行詳細介紹。
1. torch.nn.Sequential
torch.nn.Sequential 類是 torch.nn 中的一種序列容器,通過在容器中嵌套各種實現(xiàn)神經(jīng)網(wǎng)絡中具體功能相關的類,來完成對神經(jīng)網(wǎng)絡模型的搭建,最主要的是,參數(shù)會按照我們定義好的序列自動傳遞下去。
我們可以將嵌套在容器中的各個部分看作各種不同的模塊,這些模塊可以自由組合。模塊的加入一般有兩種方式,一種是在以上代碼中使用的直接嵌套,另一種是以 orderdict 有序字典的方式進行傳入,這兩種方式的唯一區(qū)別是:
- 使用
orderdict搭建的模型的每個模塊都有我們自定義的名字; - 而前者默認使用從零開始的數(shù)字序列作為每個模塊的名字;
下面通過示例來直觀地看一下使用這兩種方式搭建的模型之間的區(qū)別。
首先,使用直接嵌套搭建的模型代碼如下:
import torch as tbatch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)models = t.nn.Sequential(t.nn.Linear(input_data, hidden_layer),t.nn.ReLU(),t.nn.Linear(hidden_layer, output_data))print(models)
對該模型的結構進行打印輸出,結果如下:
Sequential((0): Linear(in_features=10000, out_features=100, bias=True)(1): ReLU()(2): Linear(in_features=100, out_features=10, bias=True)
)
使用 orderdict 有序字典進行傳入來搭建的模型代碼如下:
import torch as t
from collections import OrderedDictbatch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)models = t.nn.Sequential(OrderedDict([("Line1", t.nn.Linear(input_data, hidden_layer)),("ReLU", t.nn.ReLU()),("Line2",t.nn.Linear(hidden_layer, output_data))]))print(models)
輸出結果如下:
Sequential((Line1): Linear(in_features=10000, out_features=100, bias=True)(ReLU): ReLU()(Line2): Linear(in_features=100, out_features=10, bias=True)
)
通過對這兩種方式進行比較,我們會發(fā)現(xiàn),對模塊使用自定義的名稱可讓我們更便捷地找到模型中相應的模塊并進行操作。
2. torch.nn.Linear
torch.nn.Linear 類用于定義模型的線性層,即完成前面提到的不同的層之間的線性變換。
torch.nn.Linear 類接收的參數(shù)有三個,分別是輸入特征數(shù)、輸出特征數(shù)和是否使用偏置,設置是否使用偏置的參數(shù)是一個布爾值,默認為 True ,即使用偏置。
在實際使用的過程中,我們只需將輸入的特征數(shù)和輸出的特征數(shù)傳遞給 torch.nn.Linear 類,就會自動生成對應維度的權重參數(shù)和偏置,對于生成的權重參數(shù)和偏置,我們的模型默認使用了一種比之前的簡單隨機方式更好的參數(shù)初始化方法。
根據(jù)我們搭建模型的輸入、輸出和層次結構需求,它的輸入是在一個批次中包含 100 個特征數(shù)為 1000 的數(shù)據(jù),最后得到 100 個特征數(shù)為 10 的輸出數(shù)據(jù),中間需要經(jīng)過兩次線性變換,所以要使用兩個線性層,兩個線性層的代碼分別是
torch.nn.Linear(input_data,hidden_layer)torch.nn.Linear(hidden_layer, output_data)
可看到,其代替了之前使用矩陣乘法方式的實現(xiàn),代碼更精煉、簡潔。
3. torch.nn.ReLU
torch.nn.ReLU 類屬于非線性激活分類,在定義時默認不需要傳入?yún)?shù)。
當然,在 torch.nn 包中還有許多非線性激活函數(shù)類可供選擇,比如之前講到的 PReLU 、LeakyReLU 、
Tanh 、Sigmoid 、Softmax 等。
在掌握 torch.nn.Sequential 、torch.nn.Linear 和 torch.nn.RelU 的使用方法后,快速搭建更復雜的多層神經(jīng)網(wǎng)絡模型變?yōu)榭赡?#xff0c;而且在整個模型的搭建過程中不需要對在模型中使用到的權重參數(shù)和偏置進行任何定義和初始化說明,因為參數(shù)已經(jīng)完成了自動生成。
總結
以上是默认站点為你收集整理的PyTorch 笔记(16)— torch.nn.Sequential、torch.nn.Linear、torch.nn.RelU的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 52度景阳春多钱一箱
- 下一篇: PyTorch 笔记(18)— torc