對深度學習反捲積網絡的理解

在計算機視覺領域,很多模型都用到了反捲積,但是有一點讓我很迷惑:有的論文代碼中,反捲積是直接調用ConvTranspose2d()函數,而有的是先upsample(上採樣),再卷積,不用轉置卷積的函數,爲什麼呢?然後我就找了網上的各種博客,知乎,終於懂了,現在總結一下。

反捲積的各種叫法

  • Deconvolutional反捲積
  • Transposed Convolution轉置卷積
  • inverse Convolution逆卷積

以上是反捲積在CNN中的各種叫法,可代表同一個東西。其實反捲積(Deconvolution)比較容易引起誤會,轉置卷積(Transposed Convolution)是一個更爲合適的叫法。它不同於信號處理中的反捲積deconvolution,網絡中的反捲積只能恢復圖像尺寸,不能恢復數值。(也就是用一個學習到的卷積核轉置做反捲積,不可能得到原來的輸入圖像,但是得到的圖像可以代表原圖的部分特徵。具體可見論文【1】)【1】Visualizing and Understanding Convolutional Networks

爲了避免混淆,再說三個概念:

  • Deconvolutional反捲積
  • unsampling上採樣
  • unpooling反池化

這三個概念是不同的,面試時也可能會問到,但都屬於上採樣(upsample)(注意是up,不是un) 反捲積可以看成是一個可學習的上採樣。

常見的上採樣方法有雙線性插值、轉置卷積(反捲積)、上採樣(unsampling)和上池化(unpooling) 注意,這裏的上採樣與unsampling是有區別的,“上採樣upsample”這個詞代表意義更廣, 而unsampling是一個方法。keras、pytorch框架中專門的Upsample函數是指各種“插值算法”, 其中unsampling就是最近鄰插值。

反捲積的原理

正向卷積的實現過程

矩陣實現:

輸入圖像尺寸爲4*4,卷積核kernel爲3*3,步長strides=1,填充padding=0

(1)

(2)把3*3的kernel展成C,以便於與輸入向量相乘

矩陣相乘後,(4*16)*(16*1)=(4*1),把(4,1)的結構再展成(2,2),最後得到的應該是一個2*2大小的feature map

(簡化版,具體可參考https://blog.csdn.net/loveliuzz/article/details/84071246

原理圖:

輸入圖像爲5*5,卷積核kernel爲3*3,步長strides=1,填充padding=0

轉置卷積的實現過程

  • 反捲積是一種特殊的正向卷積
  • 通俗的講,就是原矩陣補0+卷積。先按照一定的比例通過補0來擴大輸入圖像的尺寸,接着旋轉卷積核,再進行正向卷積。

矩陣實現:

輸入圖像尺寸爲2*2,卷積核kernel爲3*3,步長strides=2,填充padding=1

中間結果矩陣大小爲9x4,然後把每一列reshape成 3x3 大小然後往6x6輸出上累加,最後再crop出中間部分,就得到結果了

參考知乎:(怎樣通俗易懂地解釋反捲積? - 梁德澎的回答 - 知乎 https://www.zhihu.com/question/48279880/answer/838063090)

原理圖

輸入圖像尺寸爲3*3,卷積核kernel爲3*3,步長strides=2,填充padding=1

與正向卷積不同的是,要先根據步數strides對輸入的內部進行填充,這裏strides可以理解成輸入放大的倍數,而不能理解成卷積移動的步長,由上面的原理圖可知,是先填充原圖,再以步長爲1滑動的。

所以說轉置卷積的本質就是內部填0+卷積運算

但爲什麼現在有些代碼會用upsample+卷積代替轉置卷積呢?

轉置卷積的弊端

關於這一節,可主要參考網址(https://distill.pub/2016/deconv-checkerboard/

棋盤效應也叫混疊效應,如果參數配置不當,很容易出現輸出feature map帶有明顯棋盤狀的現象,以下是原因:

當stride爲2的時候,kernel是奇數就會出現網格

3*3的卷積核

5*5的卷積核

當stride爲2的時候,kernel是偶數就不會出現網格

2*2的卷積核

4*4的卷積核,只有邊緣會有影響

使用能被stride整除的kernel size會抑制棋盤效應。那直接用能被整除的不就行了?錯,雖然這樣能避免一點,但不能解決根本!(後面舉例)【2】【3】

如果是多層堆疊反捲積的話而參數配置又不當,那麼棋盤狀的現象就會層層傳遞

所以當使用反捲積的時候參數配置需要特別的小心,mask rcnn的反捲積尺寸就是2*2,步長stride爲2的

爲了避免混疊效應做的一些嘗試

參考【3】

嘗試1:使得卷積核大小(4)能被步長(2)整除,但卷積核權重的學習不均勻也會導致僞影現象

嘗試2:調整卷積核的權重,適當加大重疊部分少的權重,雖然理論有效,但在實際操作中,不僅有困難也會減弱模型的表達力

嘗試3:在反捲積後面,再接一個步長爲1的卷積,可以稍微抑制棋盤效應,但效果有限

嘗試4(正確的嘗試):調整圖像大小(使用最近鄰插值或雙線性插值),然後執行卷積操作。這似乎是一種自然的方法,大致相似的方法在圖像超分辨率方面表現良好

所以說現在大多數論文會用upsample+conv的操作代替轉置卷積,下面看一下這兩種方法的實驗對比

上兩行有很明顯的棋盤效應

反捲積的應用

反捲積網絡可應用在幾個方面:(參考:如何理解深度學習中的deconvolution networks? - 譚旭的回答 - 知乎 https://www.zhihu.com/question/43609045/answer/132235276)

1、卷積稀疏編碼。反捲積網絡最先在一篇用於無監督學習的重構圖像網絡中使用。

2、CNN可視化。主要是可視化卷積:將CNN學習到的feature map作爲輸入,用得到這些feature map的卷積核,取轉置作爲反捲積塊,將圖片特徵從feature map空間轉化到pixel空間,以發現是哪些pixel激活了特定的feature map,達到分析理解CNN的目的。【1】

3、upsampling.也就是用於上採樣,比如FCN全卷積網絡

主要講3,如FCN,下面通過pytorch代碼看它如何實現的反捲積(轉置卷積)

擴大幾倍,步長就是幾,卷積核設置成步長的2倍

在u-net中的反捲積指的是“上採樣+卷積”

 

【1】Visualizing and Understanding Convolutional Networks

【2】https://distill.pub/2016/deconv-checkerboard/   對棋盤效應的解釋

【3】https://blog.csdn.net/u013289254/article/details/98980517 反捲積(Deconvolution)與棋盤效應(Checkerboard Artifacts)

【4】如何理解深度學習中的deconvolution networks? - 譚旭的回答 - 知乎 https://www.zhihu.com/question/43609045/answer/132235276

【5】怎樣通俗易懂地解釋反捲積? - 梁德澎的回答 - 知乎 https://www.zhihu.com/question/48279880/answer/838063090

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章