【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积
1 PNASNet模型簡介
? ? PNASNet模型是Google公司的AutoML架構自動搜索所產生的模型,它使用漸進式網絡架構搜索技術,并通過迭代自學習的方式,來尋找最優網絡結構。即用機器來設計機器學習算法,使得它能夠更好地服務于用戶提供的數據。該模型在ImageNet數據集上Top-1準確率達到82.9%,Top-5準確率達到96。2%,是目前最好的圖片分類模型之一。
? ? PNASNet模型最主要的結構是Normal Cell和Reduction Cell(參見arXⅳ網站上編號為1712.00559的論文),NASNet模型的主要結構使用殘差結構和多分支卷積技術,還添加深度可分離卷積(組卷積的一種特殊形式)和空洞卷積的處理。
2 組卷積
組卷積是指對原有的輸入數據先分組,再做卷積操作。不但能夠增強卷積核之間的對角相關性且減少訓練參數,不易過擬合,類似于正則效果。AlexNet模型使用了組卷積技術。
2.1 組卷積的操作規則
2.1.1?普通卷積和組卷積的不同
普通卷積和組卷積最大的不同就是卷積核在不同通道上卷積后的操作。
普通卷積是用卷積核在各個通道上進行卷積求和,所得的每一個特征圖都會包含之前各個通道上的特征信息。
組卷積是按照分組來進行卷積融合操作,在各個分組之間進行普通卷積后融合,融合生成的特征圖僅包含其對應分組中所有通道的特征信息。
?2.2? 代碼實現組卷積
2.2.1 代碼實現
import torchinput1 = torch.ones([1,12,5,5])groupsconv = torch.nn.Conv2d(in_channels=12,out_channels=6,kernel_size=3,groups=3) # 定義組卷積,輸入輸出通道必須是groups的整數倍 Group_convolution = groupsconv(input1) print("查看組卷積的卷積核的形狀",groupsconv.weight.size()) # torch.Size([6, 4, 3, 3]) print("查看組卷卷積的結果形狀:",Group_convolution.size()) # torch.Size([1, 6, 3, 3])conv = torch.nn.Conv2d(in_channels=12,out_channels=6,kernel_size=3,groups=1) # 定義普通卷積 Ordinary_convolution = conv(input1) print("查看普通卷積的卷積核的形狀",conv.weight.size()) # torch.Size([6, 12, 3, 3]) print("查看普通卷積的結果形狀:",Ordinary_convolution.size()) # torch.Size([1, 6, 3, 3])2.2.2 代碼講解
組卷積使用了6個4通道卷積核,處理過程如下
1、將輸入數據的12個通道分成3組,每組4個通道。
2、將輸入數據中第1組的4個通道分別與第1個4通道卷積核進行卷積操作,將4個通道的卷積結果加和,得到第1個通道的特征圖。
3、將輸入數據中第1組的4個通道分別與第2個4通道卷積核進行卷積操作,將第(3)步的結果按照第(2)步的方式加和,得到第2個通道的特征圖。
4、將輸入數據中第2組的4個通道分別與第3、4個4通道卷積核按照第(2)~(3)步操作,得到第3、4個通道的特征圖。
5、將輸入數據中第3組的4個通道分別與第5、6個4通道卷積核按照第(2)~(3)步操作,得到第5、6個通道的特征圖。
6、最終得到6個通道的組卷積結果。
普通卷積則直接將12個通道的卷積核與12個通道的輸入數據做卷積操作,并對其結果進行加和,得到第1個通道的特征圖。重復5次這種操作,完成整個卷積過程。
2.3?組卷積的優缺點
2.3.1 組卷積的優勢
組卷積的優勢是可以減少參數數量和計算量,可以選擇組卷積中的組大小來提高DNN的分類精度。
2.3.2 組卷積的劣勢
在組卷積中,隨意地選擇組大小會導致計算復雜性和數據重用程度之間的不平衡,影響計算的效率。
3 深度可分離卷積
深度可分離卷積是指對每一個輸入的通道分別用不同的卷積核卷積。
3.1 深度可分離卷積文章來源
Xception模型是Inception系列模型的統稱,其使用深度可分離卷積的主要目的是將通道相關性和平面空間維度相關性進行解耦,使得在通道關系和平面空間關系上的卷積操作相互獨立,以達到更好的效果。(參見arXⅳ網站上編號1610.02357的論文)。
3.2 代碼實現:深度可分離卷積
3.2.1 代碼簡述
在深度可分離卷積中,使用參數k來定義每個輸入通道對應的卷積核個數,其輸出通道數為(k×輸入通道數)。
3.2.2 代碼實現:深度可分離卷積
# 案例:實現了k為2的深度可分離卷積,在對輸入通道為4的數據進行深度可分離卷積操作時,為其每個通道匹配2個1通道卷積核進行卷積操作。# 深度可分離卷積在實現時,直接將組卷積中的groups參數設為與輸入通道in_channels相同即可。 import torch input1 = torch.ones([1,4,5,5]) conv = torch.nn.Conv2d(in_channels=4,out_channels=8,kernel_size=3) # 定義普通卷積 depthwise_conv = torch.nn.Conv2d(in_channels=4,out_channels=8,kernel_size=3,groups=4) # 定義一個k為2的深度可分離卷積,out_channels/in_channelsOrdinary_convolution = conv(input1) # 普通卷積 print("查看普通卷積的卷積核的形狀",conv.weight.size()) # torch.Size([8, 4, 3, 3]) print("查看普通卷積的結果形狀:",Ordinary_convolution.size()) # torch.Size([1, 8, 3, 3])Depthwise_convolution = depthwise_conv(input1) # 可分離深度卷積 print("查看深度可分離卷積的卷積核的形狀",depthwise_conv.weight.size()) # torch.Size([8, 1, 3, 3]) print("查看深度可分離卷積的結果形狀:",Depthwise_convolution.size()) # torch.Size([1, 8, 3, 3])4 空洞卷積
4.1 空洞卷積的含義
空洞卷積是針對圖像語義分割問題中下采樣會降低圖像分辨率、丟失信息而提出的一種卷積思路。利用添加空洞擴大感受野,讓原本3x3的卷積核,在相同參數量和計算量下擁有5x5或者更大的感受野,從而無需下采樣。
4.2?空洞卷積的圖解
4.3 空洞卷積的代碼實現
4.3.1空洞卷積代碼概述
空洞卷積也可以直接通過卷積類的diation參數來實現。diiation參數代表卷積核中每個元素之間的間隔,默認是1代表普通類。
4.3.2 空洞卷積的代碼實現
import torch # 1.0 準備數據 arr = torch.tensor(range(1,26),dtype=torch.float32) # 生成5×5的模擬數據 arr = arr.reshape([1,1,5,5]) # 對模擬數據進行變形 print("模擬數據:",arr) # 模擬數據:tensor([[[[ 1., 2., 3., 4., 5.], # [ 6., 7., 8., 9., 10.], # [11., 12., 13., 14., 15.], # [16., 17., 18., 19., 20.], # [21., 22., 23., 24., 25.]]]])# 1.1 普通卷積部分 Ordinary_Convolution = torch.nn.Conv2d(1,1,3,stride=1,bias=False,dilation=1) # 普通卷積 torch.nn.init.constant_(Ordinary_Convolution.weight,1) # 對Ordinary_Convolution的卷積核初始化 print("Ordinary_Convolution的卷積核:",Ordinary_Convolution.weight.size()) # 輸出 Ordinary_Convolution的卷積核:torch.Size([1, 1, 3, 3]) ret_Ordinary = Ordinary_Convolution(arr) print("普通卷積的結果:",ret_Ordinary) # 輸出 普通卷積的結果:tensor([[[[ 63., 72., 81.], [108., 117., 126.],[153., 162., 171.]]]], grad_fn=<ThnnConv2DBackward0>)# 1.2 空洞卷積部分 Atrous_Convolution = torch.nn.Conv2d(1,1,3,stride=1,bias=False,dilation=2) # 空洞卷積 torch.nn.init.constant_(Atrous_Convolution.weight,1) # 對Atrous_Convolution的卷積核初始化 print("Atrous_Convolution的卷積核:",Atrous_Convolution.weight.size()) # 輸出 Atrous_Convolution的卷積核:torch.Size([1, 1, 3, 3]) ret_Atrous = Atrous_Convolution(arr) print("空洞卷積的結果:",ret_Atrous) # 輸出 空洞卷積的結果:tensor([[[[117.]]]], grad_fn=<SlowConvDilated2DBackward0>)?4.4?空洞卷積的理論實現
擴張卷積/空洞卷積向卷積層引入了一個稱為 “擴張率(dilation rate)”的新參數,該參數定義了卷積核處理數據時各值的間距。
換句話說,相比原來的標準卷積,擴張卷積 多了一個擴張率dilatation rate的參數,指的是kernel各點之前的間隔數量。
4.5 空洞卷積與普通卷積的對比
4.5.1?普通3×3卷積
4.5.2?空洞卷積(dilation rate=2的3×3卷積)
下圖是一個擴張率為2的3×3卷積核,感受野與5×5的卷積核相同,而且僅需要9個參數。你可以把它想象成一個5×5的卷積核,每隔一行或一列刪除一行或一列。
在相同的計算條件下,空洞卷積提供了更大的感受野??斩淳矸e經常用在實時圖像分割中。當網絡層需要較大的感受野,但計算資源有限而無法提高卷積核數量或大小時,可以考慮空洞卷積。
4.6 空洞卷積的兩大優勢:
4.6.1?擴大感受野
在deep net中為了增加感受野且降低計算量,總要進行降采樣,這樣雖然可以增加感受野,但導致降低空間分辨率。為了不丟失分辨率,且仍然擴大感受野,可以使用空洞卷積。這在檢測分割任務中空洞卷積十分有用。一方面擴大感受野可以檢測分割大目標,另一方面分辨率高可以精確定位目標.
4.6.2?捕獲多尺度上下文信息
空洞卷積有一個參數可以設置dilation rate,具體含義就是在卷積核中填充dilation rate個0。因此,當設置不同dilation rate時,感受野就會不一樣,也即獲取了多尺度信息.多尺度信息在視覺任務中相當重要。
使用空洞卷積代替下采樣/上采樣可以很好的保留圖像的空間特征,也不會損失圖像信息。當網絡層需要更大的感受野,但是由于計算資源有限無法提高卷積核數量或大小時,可以考慮使用空洞卷積。
4.7? 空洞卷積存在的問題:
4.7.1?網格效應
當多次疊加擴張率為2的3*3 kernel時,會產生如下問題:
4.7.2 遠距離信息可能不相關
如果光采用大的擴張率的卷積可能只對一些大物體分割有效果。設計空洞卷積層的關鍵在于如何同時處理不同大小物體的關系。
總結
以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支持字典_手把手教你学Python之字典
- 下一篇: ubuntu 18 Cannot fi