pytorch——nn.Module


pytorch——nn.Module

 

構建深度學習模型的話,用autograd太抽象、底層、代碼量大實現麻煩,提供了nn.Module比較方便。nn.Module代表某一次或者某幾層的nn。一般是基礎nn.Module,寫自己的nn/nn的某層

 

 

一、Module基本知識介紹

1、在實現自己的某層的時候基礎了nn.Module,在構造函數中要調用Module的構造函數

super(Linear,self).init()

2、可學習參數放在構造函數中,並且通過nn.Parameter()使參數以parameters(一種tensor,默認是自動求導)的形式存在Module中,並且通過parameters()或者named_parameters()以迭代器的方式返回可學習參數的值

3、因為parameters是自動求導,所以調用forward()后,不用自己寫和調用backward()函數。而且一般不是顯式的調用forward(layer.farword),而是layer(input),會自執行forward()。

4、forward函數實現前向傳播過程,其輸入可以是一個或多個tensor。

5、module對象可以包含子module,Module能夠自動檢測到自己的Parameter並將其作為學習參數。除了parameter之外,Module還包含子Module,主Module能夠遞歸查找子Modul中parameters。構造函數中,可利用前面自定義的Linear層(module),作為當前module對象的一個子module,它的可學習參數,也會成為當前module的可學習參數。

 

關於可學習參數命名規范

module的parameters的話,一般就是self.para_name (例如self.w)

module的子module命名是self子module名字para_name,例如self_submodule_w

 

閱讀module相關文檔時的注意點

1、構造函數的參數 ,如nn.Linear(in_features,out_features)

2、屬性、可學習參數、子module。如nn.Linear包括w,b兩個可學習參數,無子module。

3、輸入、輸出形狀(batch_size,in_features) (batch_size,out_features)

這些自定義layer對輸入形狀都有假設:輸入的不是單個數據,而是一個batch。輸入只有一個數據,則必須調用tensor.unsqueeze(0) 或 tensor[None]將數據偽裝成batch_size=1的batch

 

二、常用的神經網絡層

 

####1、圖像層

Image.open()    打開顯示一張圖

Image->To_Tensor(如果是單個圖片要unsqueeze())->進行各種處理->ToPILImage(如果是一張圖轉化為Image之前要squeeze())->Image

 

2、卷積層(有些有反卷積層)

conv=nn.Conv2d(3,3,5,1)   // 輸入通道,輸出通道,卷積核,步長

conv.weight.data  //權重的值,可以自己賦值

to_pil(out.data.squeeze()) //顯示圖片  經過每個層,都會有該層的layer.data

 

3、池化

pool=nn.MaxPool2d(2,2)   //卷積核,步長

 

4、全連接層

nn.Linear(in_features,out_features)

 

5、BatchNorm層

BatchNorm1d(in_features)  //參數是希望輸入的特征數

他的參數是w是標准差,b是平均值

bn = nn.BatchNorm1d(4)
bn.weight.data = t.ones(4) * 4
bn.bias.data = t.zeros(4)

輸出的是均值和方差(方差是標准差平方)

 

6、dropout層

Dropout(0.5)  //每個元素以0.5的概率被舍棄,即有一半的數變為0

 

7、激活函數

nn.ReLU()

 

 

三、將nn的層連接起來

我們發現每一層的輸出作為下一層的輸入,這種前饋nn可以不用每一層都重復的寫forward()函數,通過Sequential()和ModuleList(),可以自動實現forward。這兩個函數都是特殊module,包含子module。ModuleList可以當成list用,但是不能直接傳入輸入。

 

Sequential構造方法

(a)

net1=nn.Sequential();

net1.add("conv",nn.Conv2d(3,3,5))

net1.add("batchnorm",nn.BatchNorm2d(3))

訪問方式:net1.conv(input)

(b)

net2=nn.Sequential(nn.Conv2d(3,3,5),nn.BatchNorm(3))

訪問方式:net2[0]

(c)

net3=nn.Sequential(OrderedDict([ ("conv",nn.Conv2d(3,3,5)),("batchnorm",nn.BatchNorm(3)),() ]))

訪問方式:net3.conv(input)

 

ModuleList構造方法

modulelist=nn.ModuleList([ nn.Conv2d(3,3,6),nn.BatchNorm(3) ])

訪問方式

for model in modulelist:

input=modullist(input)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM