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