1. 程式人生 > >一文詳解卷積和逆卷積

一文詳解卷積和逆卷積

文章目錄

一文詳解卷積和逆卷積

卷積神經網路(CNN)在計算機視覺大放異彩,入門CNN的第一步就是理解什麼是卷積(Convolution)運算。本文旨在以通俗易懂的方式讓讀者理解卷積的概念。

注:本文的圖片素材全部來源於網路,如有侵權,請聯絡作者刪除。

卷積運算

卷積在數學上是兩個變數在某範圍內相乘後求和的結果。在數字影象處理中,卷積操作其實就是利用卷積核(卷積模板)在影象上滑動,將影象點上的畫素灰度值與對應的卷積核上的數值相乘,然後將所有相乘後的值相加作為卷積核中間畫素對應的影象上畫素的灰度值,並最終滑動完所有影象的過程,如圖下圖所示(圖中的藍色代表輸入,青色代表輸出)。

卷積操作

在卷積運算中,我們有下面幾個概念:

  • Padding 有的時候對於給定輸入影象的大小,我們需要得到制定大小的輸出。這時候,我們可以通過給影象的邊緣增加0畫素值得方法獲得。這個0畫素值區域的大小,我們一般稱之為padding。
  • Stride 在一般的卷積過程中,我們使用步長為1進行卷積核在影象上的滑動;但是有時候出於縮小輸出圖片尺寸的原因,我們也會採用大於1的步長。卷積核每次滑動的步長,我們稱之為stride。
Padding為1的卷積 Stride為2的卷積
Padding為 1
× 1 1\times1
的卷積操作
Stride為 2 × 2
2\times2
的卷積操作

單通道

對於一個長為 H H ,寬為 W W 的灰度影象來說,其尺寸可以表示為 ( 1 , W , H ) (1, W, H) 。這裡的1我們稱之為通道(Channel)。所謂“一圖勝千言”,下面的動圖以單通道為例,演示瞭如何進行卷積運算得到最終的輸出結果。

步長為1的卷積

步長為2的卷積

多通道

那如果對於一個RGB彩色影象我們的通道就是3,對於多通道的輸入,我們如何進行卷積操作,輸出為多通道或者單通道呢?

多通道卷積

從上圖可以知道,對於多通道的輸入,卷積操作在每個Channel上分別進行,然後進行求和得到輸出。比如,我的輸入是 ( 32 , W , H ) (32, W, H) ,我的輸出是 ( 64 , W , H ) (64, W, H) ,則需要新的卷積核的個數是 32 × 64 32 \times 64 。因為,對於在輸入的32個通道的每個通道都需要64個卷積核,每個通道做完卷積運算,然後再求和,得到最後的64個通道的輸出。

卷積運算的引數計算

根據前面的分析,到這裡,卷積運算的引數的求解就很明確了。

設我們的輸入通道是 p p ,輸出通道是 q q ,則

如果我們不考慮Bias(增益),那麼對於一個 m × n m \times n 的卷積核(我們一般取 m = n m =n ),我們需要學習的引數為 ( m × n × p ) × q (m \times n \times p) \times q

如果加上Bias(就是給卷積核作用以後的結果新增一個常數),那麼我們需要學習的引數為$(m \times n \times p + 1) \times q $。

逆卷積

在CNN中,我們經常會使用所謂的逆卷積(Decovolution)進行輸入尺寸的放大,但是注意這個逆卷積不是卷積的逆操作。下面,我們還是看圖說話,到底什麼是逆卷積呢?(圖中藍色代表的是輸入,青色代表的是輸出)

逆卷積

可以看到其實逆卷積和卷積操作並沒有本質的區別,只是在輸出的尺寸上有所區別。

卷積運算的矩陣實現

那麼在計算機內部我們如何實現卷積操作呢?答案是矩陣乘法。

我們還是看圖說話,對於卷積操作,我們對輸入影象以及卷積核做Unroll操作以後,進行矩陣相乘得到輸出。

卷積操作的矩陣實現

對於逆卷積操作,我們對卷積核進行Unroll操作以後進行轉置,然後再做矩陣乘法,得到輸入。所以基於這個原因,我們一般稱逆卷積為轉置卷積(Transposed Convolution)。

逆卷積操作的矩陣實現

參考資料

  1. Convolution arithmetic
  2. Undrestanding Convolutional Layers in Convolutional Neural Networks
  3. Convolution Arithmetic in Deep Learning
  4. A guide to convolution arithmetic for deep learning