歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~git
本文由forrestlin發表於雲+社區專欄github
導語:轉置卷積層(Transpose Convolution Layer)又稱反捲積層或分數卷積層,在最近提出的卷積神經網絡中愈來愈常見了,特別是在對抗生成神經網絡(GAN)中,生成器網絡中上採樣部分就出現了轉置卷積層,用於恢復減小的維數。那麼,轉置卷積層和正卷積層的關係和區別是什麼呢,轉置卷積層實現過程又是什麼樣的呢,筆者根據最近的預研項目總結出本文。網絡
在CNN提出以前,咱們所提到的人工神經網絡應該多數狀況下都是前饋神經網絡,二者區別主要在於CNN使用了卷積層,而前饋神經網絡用的都是全鏈接層,而這兩個layer的區別又在於全鏈接層認爲上一層的全部節點下一層都是須要的,經過與權重矩陣相乘層層傳遞,而卷積層則認爲上一層的有些節點下一層實際上是不須要的,因此提出了卷積核矩陣的概念,若是卷積核的大小是nm,那麼意味着該卷積核認爲上一層節點每次映射到下一層節點都只有nm個節點是有意義的,具體的映射方式下一節會講到。到這裏,有些初學者會認爲全鏈接層也能夠作到,只要讓權重矩陣某些權重賦值爲0就能夠實現了,例如假設在計算當前層第2個節點時認爲上一層的第1個節點我不須要,那麼設置w01=0就能夠了。其實沒錯,卷積層是能夠看作全鏈接層的一種特例,卷積核矩陣是能夠展開爲一個稀疏的包含不少0的全鏈接層的權重矩陣,下圖就是一個由44圖片通過33卷積核生成一個大小爲2*2output時,卷積核所展開的全鏈接層的權重矩陣。架構
能夠看到,上面的矩陣大小爲416,比卷積核33大了很多,所以使用卷積層而不用全鏈接層第一個緣由就是能夠極大的減小參數的個數,第二個緣由就是卷積核關注的是某幾個相鄰的節點之間的關係,學習了圖片的局部特徵,能夠說是帶有目的性的學習,例如33的卷積核學習的就是相互距離爲2的節點之間的關係。這與全鏈接層無區別的對待全部節點進行學習有極大的差異,這樣一來就解決了前饋神經網絡不能學習位移不變性的缺點。舉個栗子,當咱們在前饋神經網絡中學習一個44的圖片中是否有橫折圖案時,使用下圖中4個訓練數據進行訓練,那麼最終只會對5,6,9,a這四個節點的權重有所調節,而後若是出現以下圖最後一張圖片做爲測試時,就會致使網絡沒法識別,而因爲卷積核在不一樣節點間權重是共享的,因此就天然而然克服了這個問題。機器學習
卷積層的運算其實就是將多個卷積核做用於輸入上,以下圖所示,是最簡單的一個卷積核所作的運算,no padding,no stride,底下藍色方塊看作是輸入的圖片,陰影部分就是33的卷積核(通常卷積核是個正方形,且邊長爲奇數),卷積核掃過期便與輸入相乘再相加,最終獲得22的輸出,對應青色區域。ide
一般一層卷積層會包含多個卷積核,表明着卷積層的輸出深度,例以下圖就是咱們常常在論文中看到的深度網絡的架構,其中第一層就是卷積層+最大池化層,先無論最大池化層,至少咱們能夠明確卷積核的大小是55,卷積核個數是16,該層輸出的size是1818。函數
從最簡單的卷積動圖中咱們能夠看到,通過卷積操做,輸出會比輸入要小,可是有時候咱們但願輸出的size要與輸入保持一致,而padding就是爲了這個而引入的,而這種爲了讓輸入和輸出size保持同樣的padding,咱們會稱之爲"same padding",可參考下面的動圖,卷積核大小是3*3,padding是1,padding實際的表現就是在輸入的四周補0,padding是多少就補多少層,且上限是卷積核大小-1,正以下圖中虛線區域,通常來講,論文中是不會給出padding的大小,須要咱們本身推導,推導公式可見下文。學習
根據padding大小不一樣,咱們能夠分爲三種padding:測試
stride就是步長,表示卷積核兩次卷積操做的距離,默認是1,上述講的兩個例子步長都是1,而下面兩個動圖展現的是stride爲2的狀況,分別是無padding和有padding的狀況。一般stride大於1時咱們稱爲等距下采樣,由於這樣輸出確定會丟失信息,size比輸入的小。ui
上文中咱們提到padding一般須要咱們本身算出來,那麼咱們該怎麼算呢,其實就是根據輸入輸出size和卷積核大小的關係算出來的,上面提到的幾種卷積,其實就是卷積操做的三個參數,核大小(F)、padding(P)和stride(S),若是細心的讀者在看動圖時就會發現輸出size是能夠根據輸入size和那三個參數計算出來的,公式以下,這裏只給出寬度的計算,高度也是同樣的。
W2=(W1−F+2P)÷S+1
這裏咱們注意到上面的公式是有除法的,因此就會存在除不盡的狀況,這時候咱們須要向下取整,這種狀況咱們稱爲odd卷積,其過程可參考下面動圖。
講完卷積層後,咱們來看CNN中另外一個進行卷積操做的層次轉置卷積層,有時咱們也會稱作反捲積層,由於他的過程就是正常卷積的逆向,可是也只是size上的逆向,內容上不必定,因此有些人會拒絕將二者混爲一談。轉置卷積層最大的用途就是上採樣了,剛剛咱們說到在正常卷積中stride大於1時咱們進行的是等距下采樣,會讓輸出的size比輸入小,而轉置卷積層咱們就會用stride小於1的卷積進行上採樣,使輸出的size變大,因此轉置卷積層還有個別稱就是分數卷積層。上採樣最多見的場景能夠說就是GAN中的生成器網絡,以下圖所示,雖然論文做者使用的是conv,但因爲它的步長爲1/2,因此表明的就是轉置卷積層。
爲了理解轉置卷積層,咱們須要明白什麼叫作正常卷積的逆向,這一般也是新手難以理解的地方,下面筆者經過兩個圖來更好的解釋,第一個圖是正常卷積的過程,第二個圖就是其對應的轉置卷積,在第一個圖中,大的正方形中數字1只參與小正方形中數字1的計算,那麼在轉置卷積中,大正方形的1也只能由小正方形的1生成,這就是逆向的過程。
和講述正常卷積的過程同樣,筆者下面也會一一給出相對應的轉置卷積。
上面用做解釋轉置卷積的逆向過程時用到的圖其實就是最簡單(no padding, no stride)卷積以及其對應的轉置卷積,這裏給出它的動圖。
在正卷積中若是是有padding,那麼在轉置卷積中不必定會有padding,其計算公式下文會給出,這裏先給出2.2對應的轉置卷積動圖。
在本節一開始就講到,stride大於1的卷積是下采樣,那麼其對應的轉置卷積即是stride小於1的上採樣,可是不論是在pyTorch仍是TensorFlow中,convTranspose函數的參數都是整數,不可能將stride設置爲小於1的浮點數,那麼咱們會依然給convTranspose函數傳入正卷積的stride,而convTranspose是怎麼作的呢,可見下面的動圖,它是2.3中無padding卷積對應的轉置卷積,咱們先不看轉置卷積中的轉置padding,也就是動圖中外部的虛線區域,而後會發現每兩個藍色塊之間都插入了白色塊,也就是0,這樣一來,卷積核每移動一步不就至關因而只移動了1/2步嘛,因此咱們能夠得出每兩個藍色塊之間須要插入stride -1個0。
從上面3個例子的轉置卷積中咱們能夠發現,若是用正卷積實現轉置卷積時,卷積核的大小是保持不變的,而stride是爲正卷積stride的倒數(只是咱們插入0來模擬分數移動),最後,轉置卷積的padding要怎麼算呢,雖然若是咱們調用pyTorch或TensorFlow時不須要管,傳入正卷積的padding便可,可是理解convTranspose是怎麼作的也有助於咱們理解轉置卷積。說了這麼多,其實在咱們爲了讓轉置卷積保證是正卷積的逆向時,咱們就不得不補充轉置padding,咱們用PT表示,其計算公式爲:PT=F−P−1,其中F爲正卷積的核大小,P爲正卷積的padding。
這個其實很好算,由於咱們都說轉置卷積的逆向,因此咱們只需在2.4給出公式中轉換下求出W1便可,公式以下:
W1=(W2−1)×S−2P+F
其中S是正卷積的stride,P是正卷積的padding,F是正卷積的核邊長。
這個能夠說是轉置卷積中最難理解的一種狀況,在2.4中咱們提到在除以stride時可能會除不盡要向下取整,那麼咱們在求W1時就會有不肯定性,舉個栗子,仍是第3節一開始給出的圖,咱們是但願將W/4的圖放大到W/2的程度,這是一個轉置卷積的過程,咱們先算一遍正卷積,從W/2下采樣到W/4,k表明核邊長爲3,s是stride爲1/2的倒數,即2,padding根據2.4的公式推導爲1,因此正卷積的計算公式是:(W2−3+2)÷2+1=W4+12,而後向下取整就是W4,和圖上顯示的是同樣,可是若是咱們經過3.4.2的公式反過來計算,就是(W4−1)×2−2+3=W2−1,這就是odd轉置卷積的不肯定性,咱們再回頭看2.4給出的動圖,會發現右邊和下邊的填充區域咱們並無進行卷積運算,由於向下取整而忽略了,因此咱們在轉置卷積時須要將這部分加回來,所以,在PyTorch中convTranspose函數還有一個參數output_padding就是負責處理這個的,TensorFlow應該也有相應的參數,筆者不太熟悉,下面就是PyTorch對該參數的描述,和咱們遇到的情形如出一轍。
至於output_padding的值,應該爲(W1−F+2P)%S,在上面提到的例子中就應該是1。
本文先是介紹了卷積神經網絡和傳統的前饋神經網絡的聯繫和區別,而後再經過不一樣參數的卷積過程闡述卷積運算,最後再介紹剛入門深度學習時晦澀難懂的轉置卷積,給出不一樣參數下正卷積所對應的轉置卷積,最後總結出在卷積運算中所用到的公式。但願筆者上述的分析和解釋能對剛入門CNN的同窗有所幫助,並且筆者是從事iOS開發的,對於CNN和深度學習也是剛剛入門,但願各位AI大牛們不吝指教。
此文已由做者受權騰訊雲+社區發佈,更多原文請點擊
搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!