構建深度學習模型的話,用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)
