日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积

發(fā)布時(shí)間:2024/7/5 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 PNASNet模型簡(jiǎn)介

? ? PNASNet模型是Google公司的AutoML架構(gòu)自動(dòng)搜索所產(chǎn)生的模型,它使用漸進(jìn)式網(wǎng)絡(luò)架構(gòu)搜索技術(shù),并通過迭代自學(xué)習(xí)的方式,來尋找最優(yōu)網(wǎng)絡(luò)結(jié)構(gòu)。即用機(jī)器來設(shè)計(jì)機(jī)器學(xué)習(xí)算法,使得它能夠更好地服務(wù)于用戶提供的數(shù)據(jù)。該模型在ImageNet數(shù)據(jù)集上Top-1準(zhǔn)確率達(dá)到82.9%,Top-5準(zhǔn)確率達(dá)到96。2%,是目前最好的圖片分類模型之一。
? ? PNASNet模型最主要的結(jié)構(gòu)是Normal Cell和Reduction Cell(參見arXⅳ網(wǎng)站上編號(hào)為1712.00559的論文),NASNet模型的主要結(jié)構(gòu)使用殘差結(jié)構(gòu)多分支卷積技術(shù),還添加深度可分離卷積(組卷積的一種特殊形式)空洞卷積的處理。

2 組卷積

組卷積是指對(duì)原有的輸入數(shù)據(jù)先分組,再做卷積操作。不但能夠增強(qiáng)卷積核之間的對(duì)角相關(guān)性且減少訓(xùn)練參數(shù),不易過擬合,類似于正則效果。AlexNet模型使用了組卷積技術(shù)。

2.1 組卷積的操作規(guī)則

2.1.1?普通卷積和組卷積的不同

普通卷積和組卷積最大的不同就是卷積核在不同通道上卷積后的操作。

普通卷積是用卷積核在各個(gè)通道上進(jìn)行卷積求和,所得的每一個(gè)特征圖都會(huì)包含之前各個(gè)通道上的特征信息。

組卷積是按照分組來進(jìn)行卷積融合操作,在各個(gè)分組之間進(jìn)行普通卷積后融合,融合生成的特征圖僅包含其對(duì)應(yīng)分組中所有通道的特征信息。

?2.2? 代碼實(shí)現(xiàn)組卷積

2.2.1 代碼實(shí)現(xiàn)

import torchinput1 = torch.ones([1,12,5,5])groupsconv = torch.nn.Conv2d(in_channels=12,out_channels=6,kernel_size=3,groups=3) # 定義組卷積,輸入輸出通道必須是groups的整數(shù)倍 Group_convolution = groupsconv(input1) print("查看組卷積的卷積核的形狀",groupsconv.weight.size()) # torch.Size([6, 4, 3, 3]) print("查看組卷卷積的結(jié)果形狀:",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("查看普通卷積的結(jié)果形狀:",Ordinary_convolution.size()) # torch.Size([1, 6, 3, 3])

2.2.2 代碼講解

組卷積使用了6個(gè)4通道卷積核,處理過程如下
1、將輸入數(shù)據(jù)的12個(gè)通道分成3組,每組4個(gè)通道。
2、將輸入數(shù)據(jù)中第1組的4個(gè)通道分別與第1個(gè)4通道卷積核進(jìn)行卷積操作,將4個(gè)通道的卷積結(jié)果加和,得到第1個(gè)通道的特征圖。
3、將輸入數(shù)據(jù)中第1組的4個(gè)通道分別與第2個(gè)4通道卷積核進(jìn)行卷積操作,將第(3)步的結(jié)果按照第(2)步的方式加和,得到第2個(gè)通道的特征圖。
4、將輸入數(shù)據(jù)中第2組的4個(gè)通道分別與第3、4個(gè)4通道卷積核按照第(2)~(3)步操作,得到第3、4個(gè)通道的特征圖。
5、將輸入數(shù)據(jù)中第3組的4個(gè)通道分別與第5、6個(gè)4通道卷積核按照第(2)~(3)步操作,得到第5、6個(gè)通道的特征圖。
6、最終得到6個(gè)通道的組卷積結(jié)果。

普通卷積則直接將12個(gè)通道的卷積核與12個(gè)通道的輸入數(shù)據(jù)做卷積操作,并對(duì)其結(jié)果進(jìn)行加和,得到第1個(gè)通道的特征圖。重復(fù)5次這種操作,完成整個(gè)卷積過程。

2.3?組卷積的優(yōu)缺點(diǎn)

2.3.1 組卷積的優(yōu)勢(shì)

組卷積的優(yōu)勢(shì)是可以減少參數(shù)數(shù)量和計(jì)算量,可以選擇組卷積中的組大小來提高DNN的分類精度。

2.3.2 組卷積的劣勢(shì)

在組卷積中,隨意地選擇組大小會(huì)導(dǎo)致計(jì)算復(fù)雜性和數(shù)據(jù)重用程度之間的不平衡,影響計(jì)算的效率。

3 深度可分離卷積

深度可分離卷積是指對(duì)每一個(gè)輸入的通道分別用不同的卷積核卷積。

3.1 深度可分離卷積文章來源

Xception模型是Inception系列模型的統(tǒng)稱,其使用深度可分離卷積的主要目的是將通道相關(guān)性和平面空間維度相關(guān)性進(jìn)行解耦,使得在通道關(guān)系和平面空間關(guān)系上的卷積操作相互獨(dú)立,以達(dá)到更好的效果。(參見arXⅳ網(wǎng)站上編號(hào)1610.02357的論文)。

3.2 代碼實(shí)現(xiàn):深度可分離卷積

3.2.1 代碼簡(jiǎn)述

在深度可分離卷積中,使用參數(shù)k來定義每個(gè)輸入通道對(duì)應(yīng)的卷積核個(gè)數(shù),其輸出通道數(shù)為(k×輸入通道數(shù))。

3.2.2 代碼實(shí)現(xiàn):深度可分離卷積

# 案例:實(shí)現(xiàn)了k為2的深度可分離卷積,在對(duì)輸入通道為4的數(shù)據(jù)進(jìn)行深度可分離卷積操作時(shí),為其每個(gè)通道匹配2個(gè)1通道卷積核進(jìn)行卷積操作。# 深度可分離卷積在實(shí)現(xiàn)時(shí),直接將組卷積中的groups參數(shù)設(shè)為與輸入通道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) # 定義一個(gè)k為2的深度可分離卷積,out_channels/in_channelsOrdinary_convolution = conv(input1) # 普通卷積 print("查看普通卷積的卷積核的形狀",conv.weight.size()) # torch.Size([8, 4, 3, 3]) print("查看普通卷積的結(jié)果形狀:",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("查看深度可分離卷積的結(jié)果形狀:",Depthwise_convolution.size()) # torch.Size([1, 8, 3, 3])

4 空洞卷積

4.1 空洞卷積的含義

空洞卷積是針對(duì)圖像語義分割問題中下采樣會(huì)降低圖像分辨率、丟失信息而提出的一種卷積思路。利用添加空洞擴(kuò)大感受野,讓原本3x3的卷積核,在相同參數(shù)量和計(jì)算量下?lián)碛?x5或者更大的感受野,從而無需下采樣。

4.2?空洞卷積的圖解

4.3 空洞卷積的代碼實(shí)現(xiàn)

4.3.1空洞卷積代碼概述

空洞卷積也可以直接通過卷積類的diation參數(shù)來實(shí)現(xiàn)。diiation參數(shù)代表卷積核中每個(gè)元素之間的間隔,默認(rèn)是1代表普通類。

4.3.2 空洞卷積的代碼實(shí)現(xiàn)

import torch # 1.0 準(zhǔn)備數(shù)據(jù) arr = torch.tensor(range(1,26),dtype=torch.float32) # 生成5×5的模擬數(shù)據(jù) arr = arr.reshape([1,1,5,5]) # 對(duì)模擬數(shù)據(jù)進(jìn)行變形 print("模擬數(shù)據(jù):",arr) # 模擬數(shù)據(jù):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) # 對(duì)Ordinary_Convolution的卷積核初始化 print("Ordinary_Convolution的卷積核:",Ordinary_Convolution.weight.size()) # 輸出 Ordinary_Convolution的卷積核:torch.Size([1, 1, 3, 3]) ret_Ordinary = Ordinary_Convolution(arr) print("普通卷積的結(jié)果:",ret_Ordinary) # 輸出 普通卷積的結(jié)果: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) # 對(duì)Atrous_Convolution的卷積核初始化 print("Atrous_Convolution的卷積核:",Atrous_Convolution.weight.size()) # 輸出 Atrous_Convolution的卷積核:torch.Size([1, 1, 3, 3]) ret_Atrous = Atrous_Convolution(arr) print("空洞卷積的結(jié)果:",ret_Atrous) # 輸出 空洞卷積的結(jié)果:tensor([[[[117.]]]], grad_fn=<SlowConvDilated2DBackward0>)

?4.4?空洞卷積的理論實(shí)現(xiàn)

擴(kuò)張卷積/空洞卷積向卷積層引入了一個(gè)稱為 “擴(kuò)張率(dilation rate)”的新參數(shù),該參數(shù)定義了卷積核處理數(shù)據(jù)時(shí)各值的間距。

換句話說,相比原來的標(biāo)準(zhǔn)卷積,擴(kuò)張卷積 多了一個(gè)擴(kuò)張率dilatation rate的參數(shù),指的是kernel各點(diǎn)之前的間隔數(shù)量。

4.5 空洞卷積與普通卷積的對(duì)比

4.5.1?普通3×3卷積

4.5.2?空洞卷積(dilation rate=2的3×3卷積)

下圖是一個(gè)擴(kuò)張率為2的3×3卷積核,感受野與5×5的卷積核相同,而且僅需要9個(gè)參數(shù)。你可以把它想象成一個(gè)5×5的卷積核,每隔一行或一列刪除一行或一列。

在相同的計(jì)算條件下,空洞卷積提供了更大的感受野??斩淳矸e經(jīng)常用在實(shí)時(shí)圖像分割中。當(dāng)網(wǎng)絡(luò)層需要較大的感受野,但計(jì)算資源有限而無法提高卷積核數(shù)量或大小時(shí),可以考慮空洞卷積。

4.6 空洞卷積的兩大優(yōu)勢(shì):

4.6.1?擴(kuò)大感受野

在deep net中為了增加感受野且降低計(jì)算量,總要進(jìn)行降采樣,這樣雖然可以增加感受野,但導(dǎo)致降低空間分辨率。為了不丟失分辨率,且仍然擴(kuò)大感受野,可以使用空洞卷積。這在檢測(cè)分割任務(wù)中空洞卷積十分有用。一方面擴(kuò)大感受野可以檢測(cè)分割大目標(biāo),另一方面分辨率高可以精確定位目標(biāo).

4.6.2?捕獲多尺度上下文信息

空洞卷積有一個(gè)參數(shù)可以設(shè)置dilation rate,具體含義就是在卷積核中填充dilation rate個(gè)0。因此,當(dāng)設(shè)置不同dilation rate時(shí),感受野就會(huì)不一樣,也即獲取了多尺度信息.多尺度信息在視覺任務(wù)中相當(dāng)重要。

使用空洞卷積代替下采樣/上采樣可以很好的保留圖像的空間特征,也不會(huì)損失圖像信息。當(dāng)網(wǎng)絡(luò)層需要更大的感受野,但是由于計(jì)算資源有限無法提高卷積核數(shù)量或大小時(shí),可以考慮使用空洞卷積。

4.7? 空洞卷積存在的問題:

4.7.1?網(wǎng)格效應(yīng)

當(dāng)多次疊加擴(kuò)張率為2的3*3 kernel時(shí),會(huì)產(chǎn)生如下問題:


  
4.7.2 遠(yuǎn)距離信息可能不相關(guān)

如果光采用大的擴(kuò)張率的卷積可能只對(duì)一些大物體分割有效果。設(shè)計(jì)空洞卷積層的關(guān)鍵在于如何同時(shí)處理不同大小物體的關(guān)系。

總結(jié)

以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。