16 PyTorch 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)【動手學深度學習v2】

神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
層和塊

net規(guī)定了網(wǎng)絡(luò)形狀,由一個(20,256)和(256,10)的全連接網(wǎng)絡(luò)和夾在其中的ReLU激活函數(shù)構(gòu)成
X為初始參數(shù),包含兩個樣本,每個樣本中有20維度。
下圖:用Pytorch中的Moudle構(gòu)造神經(jīng)網(wǎng)絡(luò)


Sequential函數(shù)構(gòu)建神經(jīng)網(wǎng)絡(luò)(同樣繼承自moudle父類):

其他更靈活的定義網(wǎng)絡(luò)的方法:
(torch.mm是指矩陣乘法)
下圖所示前饋方法并沒有實際意義,只是為了說明定義網(wǎng)絡(luò)的靈活性。

網(wǎng)絡(luò)層之間的嵌套(網(wǎng)絡(luò)計算順序是Sequential函數(shù)括號內(nèi)部由左到右):

參數(shù)管理

net可以視為python里的list類別,可以通過序號對其內(nèi)容進行訪問。
此處使用state_dict對net中的第三層進行訪問,輸出其狀態(tài)(對于感知機來說,其狀態(tài)等于其所含參數(shù):weigh和bias)

可以訪問層中的具體參數(shù)。每個層中的w,b各含兩個元素:data(記錄該元素具體值)和grad(記錄該元素梯度值,在未進行梯度計算時,顯示None)

一次性訪問網(wǎng)絡(luò)中所有參數(shù)

“*” :解包作用


網(wǎng)絡(luò)有嵌套時的情形:
block1:簡單的全連接層
block2:含有四個block1的網(wǎng)絡(luò)
rgnet:block2+ReLU

rgnet結(jié)構(gòu)
(bias值為True時,表示會為線性層添加偏置項)

設(shè)置初始參數(shù)
init_normal:初始化為正態(tài)分布
init_constant:初始化為常數(shù)(不推薦)

net.apply(init_normal)
在net中各層套用init_normal


對不同的塊使用不同的數(shù)據(jù)初始化:
Xavier初始化:詳見李沐Pytorch筆記14
此處對第一層應用Xavier初始化,對第三層應用常數(shù)初始化

自定義初始化:保留絕對值大于5的權(quán)重,其他權(quán)重置0.

直接修改法

權(quán)重共享:
指定網(wǎng)絡(luò)中第二層和第三層權(quán)重保持一致(此處激活層不算在層數(shù)中)

自定義層
以下代碼定義了一個無參數(shù)層,能夠?qū)⑤斎霐?shù)據(jù)的平均值變?yōu)?


以下代碼通過自定義構(gòu)建一個線性全連接層,需要的參數(shù)有輸入維度和輸出維度。計算所用的w與b在函數(shù)內(nèi)部按正態(tài)分布生成。

使用例

讀寫文件

torch.save(x, 'x-file')
將x值存儲在當前目錄下的 x-file中
以下程序演示存儲了list

以下程序演示存儲了模型參數(shù)

通過儲存state_dict儲存模型信息

使用這個被儲存的模型時,要先將新的模型也定義為與被儲存模型相同的結(jié)構(gòu)(clone=MLP())然后進行應用

eval():開始訓練,此處功能應該類似于train()
補充知識:
Sequential默認kaiming初始化,該方法在未來會有涉及