4.3 常用網路層

本小節將介紹幾個常用的layers,核心目的是傳授如何學習各layers的方法,今後更多layers也可自行從官方文檔中學習。

Convolutional Layers

卷積整體分兩大類,正常卷積與轉置卷積(Transpose Convolution),除此之外還有Lazy系列的正常卷積與轉置卷積,Lazy系列就是懶惰系列,為那些懶得計算輸入特徵圖的通道數的使用者而設計,經過第一次forward之後,該網路層的in_channels將被確定。

下面通過官方文檔詳細學習Conv2d這個卷積層,在文檔中會詳細介紹該層的功能,各參數含義,計算公式,以及示例代碼。

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

主要功能:對多個二維平面組成的信號進行二維卷積

主要參數:

  • in_channels (int) – Number of channels in the input image。輸入這個網路層的圖像的通道數是多少。
  • out_channels (int) – Number of channels produced by the convolution。此網路層輸出的特徵圖的通道數是多少,等價於卷積核數量是多少。
  • kernel_size (int or tuple) – Size of the convolving kernel。卷積核大小。
  • stride (int or tuple, optional) – Stride of the convolution. Default: 1。卷積核卷積過程的步長。
  • padding (int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0。對於輸入圖像的四周進行填充的數量進行控制,可指定填充圖元數量,也可以指定填充模式,如"same", "valid",具體含義參見文檔,這是從TF中借鑒過來的。
  • padding_mode (string, optional) – 'zeros', 'reflect', 'replicate' or 'circular'. Default: 'zeros'。填充的圖元值如何確定。默認填充0
  • dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1。孔洞卷積的孔洞大小。
  • groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1。分組卷積的分組。
  • bias (bool, optional) – If True, adds a learnable bias to the output. Default: True。是否採用偏置。

nn.Conv2d是圖像領域裡99%模型都用到的,它的計算公式及細節需要大家瞭若指掌,具體公式如下:`

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

這裡建議大家結合各種動圖進行學習,推薦這個repo

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

Pooling Layers

Pooling layer叫池化層,池化是形象詞,就像下雨天籃球場上低窪的地方會聚集周圍的雨水一樣,由大變小的過程。

自然它的作用是將特徵圖解析度變小,通常減小一半。如下圖所示,相同顏色的區域池化1個圖元,4x4的圖像變為了2x2的圖像。

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

圖片來源:https://www.geeksforgeeks.org/cnn-introduction-to-pooling-layer/

1個圖元代替4個圖元,那應該用什麼值呢?針對這個問題,可對池化層進行劃分,分為最大值池化、平均值池化、分數階池化、基於范數的池化。分別對應torch.nn中的Maxpool, Avgpool, FractionalMaxPool, LPPool

由於它們只是在計算圖元時才用的方法不同,下面就以Maxpool為例講解池化層。

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

功能:2D最大池化

參數:

  • kernel_size – 池化窗口大小
  • stride – 滑窗步長
  • padding – 原圖填充大小
  • dilation – 孔洞大小
  • return_indices – 是否返回最大值所在位置,主要在 torch.nn.MaxUnpool2d 中使用,是上採樣的一種策略
  • ceil_mode – 當無法整除時,是向下取整還是向上取整,默認為向下取整。

池化層輸出特徵圖的大小計算公式如下,細心的朋友會發現它與卷積層是一樣的。

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

針對最大池化還有一個特殊的地方是它可以記錄最大值所在的位置,供上採樣時(MaxUnpool2d)所用,這個在圖像分割任務中會有涉及。MaxUnpool2d的使用非常簡單,參數設置很容易。原型如下:

torch.nn.MaxUnpool2d(kernel_size, stride=None, padding=0),具體使用可看配套代碼。

自我調整池化層

上面針對池化圖元如何取值進行劃分,其實針對視窗大小的選擇也可劃分,還有另外一種特殊的池化方法,那就是AdaptiveXpool 它的作用是自我調整視窗大小,保證經過池化層之後的圖像尺寸是固定的,這個在接入全連接層之前經常會見到。

使用也很方便,只需要設置想要的輸出大小即可,詳細可見配套代碼torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)

Padding Layers

Padding layer在許多魔改網路中常用到,功能是給特徵圖周圍填充一定的圖元,調整特徵圖解析度的一種方法。既然是填充就涉及兩個問題,填充多少個圖元?圖元應該如何確定?

針對第二個問題,可將padding layer劃分為三類,鏡像填充、邊界重複填充,指定值填充、零值填充,分別對應nn的三大類,nn.ReflectionPad2d nn.ReplicationPad2d nn.ZeroPad2d nn.ConstantPad2d,使用非常簡單,詳細可見配套代碼

Linear Layers

Linear Layers包含4個層分別是nn.Identitynn.Linear nn.Bilinear nn.LazyLinear

nn.Identity 是恒等映射,不對輸入做任何變換,它通常用於占位。

nn.Linear 就是大家熟悉的全連接層(Fully Connection Layer),可實現 y= Wx + b

nn.Bilinear 是雙線性層,它有兩個輸入,實現公式 y = x1Wx2 +b

nn.LazyLinear nn.Linearlazy版本,也就是懶惰的Linear層,它在第一次推理時自動根據輸入特徵圖的尺寸來設定in_features,免去了手動計算in_features的麻煩。

Linear層十分簡單,就不用代碼演示了。

Normaliation Layers

Normaliation Layers 裡包含主流的標準化網路層,分別有BNLNINGN以及早期的LRN。這一些列的層已經成為現在深度學習模型的標配,它們充當一種正則,對資料的分佈進行變換,使資料分佈變到0均值,1標準差的形式。實驗結果發現這樣做可以加速模型訓練,讓模型更穩定,精度更高。

其中最出名的當屬2015年提出的BatchNorm, 來自於Google團隊的Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift,關於BN的介紹網上有很多文章,大家可自行學習,在代碼實現上我們需要熟悉網路層內部的參數,以及訓練與推理過程中的差異。

BatchNorm 會對輸入進行減均值、除以標準差、乘以γ、加β的操作。如下圖所示:

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

其中γβParameter,是可訓練的參數,與卷積層的卷積核、FC層的權重一樣,容易理解。

均值與標準差就沒那麼簡單了,在訓練過程,它們是通過指數移動平均統計得來,在測試時則是用固定的、不會再變化的均值和方差。

從此也可知道,當模型設置在訓練狀態(model.train() )與推理狀態(model.eval() )時,BN層的操作輸出是會不一樣的。

方法原型如下:

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)

  • num_features – 輸入的通道數,該參數將決定BN層有多少個γβ
  • eps – 分母增加的一個小數,防止除以0,預設值為1e-5
  • momentum – 指數滑動平均的動量值,Default: 0.1
  • affine – 是否執行乘以γ、加β的操作,要理解為什麼叫affine需要去看論文。Default: True
  • track_running_stats – 是否需要執行記錄統計均值、統計方差。默認是開啟的,如果不開啟,則計算時的均值方差只來自當前batch的計算值。 Default: True

具體使用方法詳細可見配套代碼,請嘗試調整各個參數,觀察輸出的變化以及網路層本身參數的變化。

BN提出之後幾乎成了深度學習模型的標配,但在一些任務中BN的均值、方差計算方式就不太適用了,針對均值、方差的統計方式不同,就有了GNLNIN

GN是針對batch size小(一些任務占顯存大,只能用小batch跑),統計的均值方差存在較大差異而提出的分組進行統計,詳細參見:Group Normalization

LN是針對RNN這樣的序列網路設計的,以層為單位進行統計均值、方差,詳細參見:Layer Normalization

IN是針對風格遷移這類GAN任務中,不同風格實例的差異較大,以實例為單位進行統計均值、方差,詳細參見:Instance Normalization: The Missing Ingredient for Fast Stylization

LRN2012年深度學習圖像領域開山之作——AlexNet中採用的正則化方法,現在很少採用,詳細參見:ImageNet Classifification with Deep Convolutional Neural Networks

Dropout Layers

Dropout——隨機失活和LRN一樣在Alexnet論文中所採用,以防止模型過擬合,針對它的正則化作用探討可參見由Hinton一作發表的論文Improving neural networks by preventing co-adaptation of feature detectors

Dropout 的操作非常簡單,以概率p隨機的讓部分神經元暫時失活,失活表示它不與任何神經元連接,如下圖所示:

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

圖片出自:《Dropout: A Simple Way to Prevent Neural Networks from Overfitting

訓練過程的每一次forward,都會重新進行隨機失活。在測試(推理)過程,所有神經元都參與工作,不再採用隨機失活。更詳細的操作及理論分析,推薦閱讀《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》。

Dropout使用注意事項:

  • Dropout通常用於nn.Linear層之前
  • Dropout執行後,神經元個數會減少,導致資料尺度發生變化

論文中給出的方法是在測試時,需要將神經中繼資料尺度縮放 1/p倍,因為在訓練時候減少了p倍。(p為隨機失活的概率)。但在工程應用的時候,最好是減少推理的步驟,於是pytorch把資料尺度的縮放弄到了訓練中,在訓練時,對資料進行1/(1-p)的放大。(Furthermore, the outputs are scaled by a factor of 1/(1-p) during training.

關於資料尺度縮放,這裡設計了驗證實驗,可到配套代碼中運行並查看。

Alpha Dropout

Dropout的隨機失活會導致資料分佈的變化,而資料分佈對於模型訓練的穩定是非常關鍵的,因此有針對這個問題提出了一種保持輸入均值和方差不變的Dropout——Alpha Dropout。理論分析建議閱讀論文Self-Normalization Neural Networks

FeatureAlphaDropout是基於通道維度進行的,並且不同於Dropout的置零,它是將神經元設置為SELU啟動函數的負飽和值,通常 Alpha Dropout都是搭配SELU啟動函數的,具體推導還是要看論文Self-Normalization Neural Networks,一篇102頁的論文。

Non-linear Layers

非線性啟動函數是深度學習的命根子,倘若沒有非線性變換函數,那麼1億層的Linear層堆疊,也只能等價於1層網路(通過矩陣乘法法則可推導)。因此非線性啟動函數是深度學習之所以能稱之為深度的重要因素。

對於非線性啟動函數,pytorch劃分為了兩大類,這是非常合理的!分別是Non-linear Activations (weighted sum, nonlinearity) Non-linear Activations (other)

其實可以作用進行劃分

  • 為了對神經元進行非線性變換的稱為非線性啟動函數
  • 為了對輸出神經元進行Softmax的、變為概率分佈形式的稱為特殊非線性啟動函數

更通俗的劃分是:

  • softmx的;
  • softmax系列;

對於非softmax,大家肯定不陌生,如sigmoidtanhReLUPReLU等,這些就不過多介紹,請大家自行查閱文檔

對於softmax需要簡單講一講,softmax的作用是將一個向量轉換為一個概率分佈的形式,以便於實現loss的計算,計算過程如下圖所示:

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

計算公式如下:

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

看著一頭霧水,其實很好理解。一個概率向量它的要求至少有這兩個

  1. 非負
  2. 求和等於1

對於非負,用上冪函數,就可以實現了;

對於求和對於1,那就所有元素除以一個求和項,所有元素再加起來的時候分子就等於分母,自然求和等於1了,Softmax的設計思路真巧妙!

對於Softmax系列的啟動函數,可參考文檔

小結

本文對pytorch常用的網路層介面進行了介紹與代碼分析,由於深度學習模型發展迅速,難以詳盡介紹每一個網路層的使用,但pytorch都有詳細的文檔可以學習,希望大家可以通過本節內容學習如何學習pytorch的系列函數、類方法使用。

本小節配套代碼中有這些網路層的演示:

<<AI人工智慧 PyTorch自學>> 4.3 常用網路層

更多更詳細的網路層使用介紹,可查看文檔中的目錄,這裡簡介每個主題的內容

到這裡,Module的類型就介紹完畢,下一小節將學習Module內部有哪些api,如何使用它們對一個Module進行管理,如模型的網路層查看、管理,模型的參數查看、管理,以及Hook函數的用法。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 HCHUNGW 的頭像
    HCHUNGW

    HCHUNGW的部落格

    HCHUNGW 發表在 痞客邦 留言(0) 人氣()