輸入側在左面(下面是有padding的,上面是無padding的),可以看到網絡中用到了很多2x2的pooling
同樣,在做語義分割或者目標檢測的時候,我們用到了相當多的上採樣,或者轉置卷積
典型的fcn結構,注意紅色區分的decovolution
以前,我們在分類網絡的最後幾層使用fc,後來fc被證明參數量太大泛化性能不好,被global average pooling替代掉了,最早出現在network in network中,
GAP直接把每個通道對應空間特徵聚合成一個標量
從此,分類網絡的範式變為(Relu已經被隱式帶在了onv和deconv裡面),Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->GAP-->Conv1x1-->Softmax-->Output
而分割網絡的範式變為(最近的一些文章也在考慮用upsample+conv_1x1代替deconv),Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Deconv_x_2-->Deconv_x_2-->Deconv_x_2-->Softmax-->Output
可是,我們不得不去想,下採樣,上採樣真的是必須的嗎?可不可能去掉呢?
空洞卷積和大卷積核的嘗試一個很自然的想法,下採樣只是為了減小計算量和增大感受野,如果沒有下採樣,要成倍增大感受野,只有兩個選擇,空洞卷積和大卷積核。所以,第一步,在cifar10的分類上,我嘗試去掉了下採樣,將卷積改為空洞卷積,並且膨脹率分別遞增,模型結構如下所示,
這個網絡的卷積結構,注意最後用一個空間範圍的全局平均直接拉平為特徵向量,最後再跟一個10維的全連接層
這是一個典型的四層的VGG結構,每層卷積的dilation_rate分別為1,2,4,8。在訓練了80個epoch後,測試集準確率曲線如下所示 ,
四層VGG網絡,卷積的dilation_rate分別是1,2,4,8,可訓練參數量25474
最終的準確率達到了76%,相同參數的vgg結構的卷積網絡能夠達到的準確率基本就在這附近。
從另一種思路出發,為了擴大卷積的感受野,也可以直接增加卷積的kernel_size,與上面對比,保持dilationrate為1不變,同時逐層增大卷積的kernel_size,分別為3,5,7,9,訓練80個epoch後得到如下準確率曲線,
四層VGG網絡,卷積的kernel_size分別是3,5,7,9,可訓練參數量為172930
和之前改變dilation_rate的方式比較,收斂過程很一致,略微震蕩一點,但是最終的結果很一致,都在76%上下,這說明影響最終精度的因素只有感受野和每層的通道數。
為了說明下採樣在性能方面沒有提升,用有下採樣的網絡對對比。即在不修改其他任何參數的情況下,對原本使用dilation的卷積層使用下採樣,stride都設置為2,同樣訓練80個epoch,收斂結果如下,
四層VGG網絡,每層使用stride為2的卷積進行下採樣,可訓練參數量25474
最終收斂到了73%上下,比上面兩個實驗低了大約3個點,這說明下採樣的信息損失確實不利於CNN的學習。
把三種參數的結果放在一起對比,更能夠說明問題,
四層VGG網絡的對比結果,除了卷積層參數不同,其他參數均相同
為了驗證這種想法的通用性,使用resnet18結構的網絡,並在原本需要下採樣的卷積層使用dilation_rate不斷增大的空洞卷積替代。訓練80個epoch後,最終得到的準確率曲線如下 所示,
resnet18上的準確率曲線,網絡通過改變卷積層dilation_rate得到
在沒有其他任何調參的情況下,最後收斂到了87%的準確率。
小卷積核的嘗試我們知道,大卷積核的感受野通常可以通過疊加多個小卷積核得到,vggnet首先發現5x5卷積可以用兩個3x3卷積代替,極大減少了參數量。
兩個3x3卷積的感受野和一個5x5卷積相同,但是參數少一半
同樣的7x7卷積可以用三個3x3卷積級聯,9x9可以用四個3x3卷積級聯。
為了獲得和上面四層卷積網絡相同的感受野,我設計了一個十層的只有3x3卷積的網絡,每層之間依然有非線性。因為層數多了很多,為了確定中間層的通道數,我做了幾組實驗。同時,為了不極大增加參數量,我又在卷積中間插入depthwise卷積,這樣保持對應感受野上的通道數不變,而參數量不至於增加很多。訓練結果,
實驗結果,後面的數字表示每層對於的通道數
可以看到,只有三個網絡結構在精度上優於之前的設計,而這三個網絡的參數量都是之前的數倍。使用depthwise卷積的網絡參數量並沒有增加太多,但是精度還是略低於之前的設計。
為了說明問題,增加每層的通道數,比如之前16-32-48-64的設計,改為64-128-256-512的設計,基本上對於這個深度的網絡來說,容量已經接近上界了,結果如下,
增加通道數的結果
可以看到,空洞卷積網絡依然以較小的參數領先於depthwise卷積和3x3卷積混合網絡,並以數倍更少的參數優勢,在精度上略低於3x3級聯網絡。
這個實驗表明,對於CNN而言,深度之外,感受野以及該感受野上的通道數,真正決定了網絡的性能。
這和語音中的wavenet是相似的,
通用wavenet
空洞wavenet
wavenet使用空洞因果卷積來降低計算量,原始wavenet的性能並沒有問題,但是計算量和參數量指數增長。
稀疏化方面的思考小卷積核疊加和大卷積核的方法為了獲得和空洞卷積相同的性能,付出了參數上的巨大代價,而空洞卷積本身是稀疏的(大多數元素都是0),這促使我們思考,是否可以用稀疏化解決參數巨大的問題。
CNN的稀疏化最近研究很多,一般的卷積稀疏化見下圖,並注意到每層卷積的卷積參數都是四維的,即輸入通道數,輸出通道數,x方向的卷積尺寸,y方向的卷積尺寸。
四種不同的稀疏卷積,因為卷積核權重四維的,最左邊稀疏性是最不規則的,越向右規則的維度則越多,越有利於硬體加速
我們常見的其實是通道維度的稀疏化,這相當於減少通道數,也最容易加速,但是更有意義的稀疏化,我認為是卷積核內部的稀疏化,如下圖所示,
最左側沒有稀疏化,中間有零值(也就是稀疏化),最右側有1x2的塊狀稀疏化
這種稀疏化能減少參數量(因為零值是沒有意義的),但是因為不利於工程實現,所以目前沒有明顯的加速效果。
近期的研究表明,CNN裡大多數卷積核都是稀疏的,大約有50%以上都是稀疏的,也就是說有50%以上參數都是冗餘的。如果能去掉冗餘參數,那麼大卷積核和多層小卷積核也能證明在感受野和特定感受野上的通道數對CNN性能的決定性影響,在不增加額外模型參數的前提下。
儘管很容易預測,但是接下來,我們還會證明這兩種方法的參數冗餘。
10層3x3級聯網絡的可訓練參數量是86404,4層空洞卷積網絡參數量是25474,4層大卷積核網絡參數量是172930。使用tensorfllow內置的稀疏化功能,其官方github地址為model_optimization,原理即在訓練過程中,按一定的準則將卷積核的一些元素置為零,然後finetune。對於10層3x3級聯網絡,選擇稀疏率為25%,這樣稀疏化後的參數量為21601,對於大卷積核網絡,選擇常數稀疏率為15%,稀疏化的參數量為25940,這樣稀疏化後它們的參數都比空洞卷積網絡更少。為保證網絡不會繼續收斂了,訓練1000個epoch,稀疏化從第200個epoch開始,稀疏化後的訓練結果如下所示,
可以明顯的看到稀疏化後的3x3級聯網絡的性能是最好的,同時它的參數也是最少的,同時大卷積核的性能次之,這個時候空洞卷積的性能反而略低。
保持同樣的參數和稀疏度,在cifar100上訓練的結果如下所示,
這個時候級聯3x3網絡的性能已經遠超其他兩個網絡了(對於cifar100上的baseline取多少合適,大家可以參閱一些文章或博客)。
稀疏化極限的思考我們上面的討論基本就是,只要能保住某個感受野,稀疏化也是可行的,但是又不禁想知道稀疏化的極限在哪裡,對於3x3的卷積核,在保住感受野的情況下,最少必須有兩個非零元素,但是這樣一來卷積核就退化了,從各向同性退化為各向異性,
前面兩個卷積核只有一個方向性(對角線方向),最後一個有兩個方向性
學過線性代數的同學都知道,在二維線性空間至少有兩個基底向量,才能合成各種方向的梯度。如果卷積核退化成前面兩個的情況下,卷積核的二維性質也許就損失掉了,但是同一層中只要有多個卷積核具有不同的方向性,那麼這一層依然可能是各向同性的,方向性也許也是感受野的一個重要描述。關於感受野的方向性,一個來自視覺皮層實驗的啟示如下:
人類視覺皮層中不同方位調諧的感受野分布
感受野的意義。只有大感受野才能感受到尺寸比較大的物體。感受野,深度和通道數,共同決定了cnn某一層的性能,一個衡量cnn性能的正確表述應該是網絡在某一層有多大的深度和感受野,同時有多少通道。深度決定了網絡的抽象能力或者說學習能力,感受野和通道決定了網絡學到了多少東西
Input-->Conv(dilate_rate=1)-->Conv(dilate_rate=2)-->Conv(dilate_rate=4)-->Conv(dilate_rate=8)-->GAP-->Conv1x1-->Softmax-->Output
Input-->Conv(dilate_rate=1)-->Conv(dilate_rate=2)-->Conv(dilate_rate=4)-->Conv(dilate_rate=8)-->Conv(dilate_rate=16)-->Conv(dilate_rate=32)-->Softmax-->Output
不再有decoder階段,因為到了decoder,上採樣只是為了恢復解析度,在無採樣的網絡結構裡,在最大感受野處,即之前加入global average pooling的地方可以直接接softmax進行pixel level的分類,這還需要更多實驗。一句話說來,CNN一種利用卷積實現二維泛函空間到二維泛函空間映射的神經網絡。
以一維為例,這就相當於把(-1,1)上的有界函數f映射到有界函數g的一個泛函:為什麼用卷積呢?眾所周知,卷積是最簡單的這樣一個泛函並且它有著諸多良好的性質,最重要的是,卷積有平移不變性,所以對於任意一個算子