恢復特征圖分辨率的方式對比:反卷積,上池化,上采樣
文章目錄
- 1.(反)卷積-
利用 CNN 做有關圖像的任務時,肯定會遇到 需要從低分辨率圖像恢復到到高分辨率圖像 的問題。解決方法目前無非就是 1)插值,2)反卷積
一般 上采樣 (upsamping) 就使用了插值法,包括 “最近鄰插值”,“雙線性插值”,“雙三次插值”。這些方向好比時手工的特征工程,網絡是不會對此有任何學習行為的。
如果想要讓網絡學習如何才能最優地進行上采樣,就可以使用 轉置卷積,轉置卷積沒有預先定義好的插值方法,而是具有可學習的參數。
1.(反)卷積
**卷積(Convolution)**的主要目的就是對事物進行特征提取,然后根據特征對其進行識別或決策。而 **反卷積(Deconvolution)**也叫做轉置卷積(Transposed Convolution),其目的是恢復特征圖的分辨率,一般用於圖像分割任務中,需要恢復特征圖到原圖大小的情況。
(反)卷積原理
假設有一張
4 × 4 4 \times 4 4×4 的輸入矩陣(Input),現在要用 3 × 3 3 \times 3 3×3 的卷積核(Kernel)對其進行卷積操作,無 padding,stride 為 1,容易知道輸出矩陣(Output)是一個 2 × 2 2 \times 2 2×2 大小的矩陣。卷積輸出維度計算公式:
o u t p u t = ( i n p u t + 2 ∗ p − k ) / s + 1 output = (input + 2 * p - k) / s + 1 output=(input+2∗p−k)/s+1其中,input 為輸入矩陣的大小,p 為 padding,k 為卷積核大小,s 為卷積步長。根據計算公式可知,卷積后輸出大小為
( 4 + 0 − 3 ) / 1 + 1 = 2 (4+0-3)/1+1=2 (4+0−3)/1+1=2。 具體的卷積過程是這樣的:<font color="red">Kernel 每次覆蓋在 Input 上進行元素級相乘再求和,就得到了 2 × 2 2 \times 2 2×2 Output 上對應位置的輸出</font>。 <img src="https://img-blog.csdnimg.cn/20191109212208939.png" alt="在這里插入圖片描述"><br> 可以看出,卷積操作是 **“一對多”** 的過程,即 <font color="red">多個值對應一個值</font>,從而達到提取特征的作用。通常卷積操作會使得輸入矩陣變小,如果想要保留原尺寸,只需要修改 pad 大小為
P = 1 / 2 ∗ ( k − 1 ) P = 1/2 *(k-1) P=1/2∗(k−1) 即可,通常 pad 的像素值取 0。反過來,我們已經得到了
2 × 2 2 \times 2 2×2 大小的輸出矩陣(Output),現在要將其恢復到原本的 4 × 4 4 \times 4 4×4 大小的輸入矩陣(Input),這就是讓當前矩陣(Output)中的一個值對應到多個值,這就是反卷積。反卷積輸出維度計算公式:
o u t p u t = ( i n p u t − 1 ) ∗ s + k − 2 ∗ p output = (input - 1) * s + k - 2 * p output=(input−1)∗s+k−2∗p其中,input 為輸入矩陣的大小(此時的 Input 是
2 × 2 2 \times 2 2×2 大小的矩陣,即經過卷積得到的矩陣),p 為 padding,k 為卷積核大小,s 為卷積步長。根據計算公式可知,反卷積后輸出大小為 ( 2 − 1 ) ∗ 1 + 3 − 0 = 4 (2-1)*1+3-0=4 (2−1)∗1+3−0=4。<br> <img src="https://img-blog.csdnimg.cn/2019110923053637.png" alt="在這里插入圖片描述"><img src="https://img-blog.csdnimg.cn/20191110104156366.gif" alt="在這里插入圖片描述">(反)卷積過程
上面卷積核在輸入矩陣上不停移動和計算的過程,在實際運算時,其實是將 卷積核重新排列為了 “卷積矩陣”、輸入矩陣拉成了一列:如下是
3 × 3 3 \times 3 3×3 的卷積核,將它重排列為 4 × 16 4 \times 16 4×16 的矩陣,空余的地方用 0 來填充。這個 4 × 16 4 \times 16 4×16 是根據輸入矩陣的大小決定的,4 表示卷積核會在輸入矩陣上進行卷積運算 4 次(也就是每一行都表示一次卷積運算),16 為輸入矩陣的數據個數。 輸入矩陣 Input 原本是 4 × 4 4 \times 4 4×4 大小的矩陣,現在拉平為一個 16 × 1 16 \times 1 16×1 的列向量,然后將卷積矩陣與輸入矩陣的列向量進行相乘,得到 4 × 1 4 \times 1 4×1 的列向量,然后 reshape 到 2 × 2 2 \times 2 2×2,就得到了卷積結果。<br> <img src="https://img-blog.csdnimg.cn/20191110155812111.png" alt="在這里插入圖片描述">反卷積就是卷積的逆操作,想要根據得到的
2 × 2 2 \times 2 2×2 大小的輸出矩陣恢復到 4 × 4 4 \times 4 4×4 大小的輸入矩陣,只需要將 shape 為 4 × 16 4 \times 16 4×16 的 **卷積矩陣 C** 轉置一下,得到 shape 為 16 × 4 16 \times 4 16×4 的 **轉置卷積矩陣 C.T**,然后用這個轉置卷積矩陣與拉成列向量的 2 × 2 2 \times 2 2×2 輸出矩陣進行矩陣相乘,就可以得到一個 16 × 1 16 \times 1 16×1 的列向量,同樣將它 reshape 到 4 × 4 4 \times 4 4×4 就 OK 啦。 需要注意的是,<font color="red">**反卷積並不能還原出卷積之前的特征圖,只能還原出卷積之前特征圖的尺寸**</font>。反卷積(Transposed Convolution)在搭建網絡時主要有兩個作用:
- 像素級分割,需要將圖像尺寸恢復到原本的大小;1. 可視化特征,通過反卷積將網絡中間層輸出的 feature map 還原到像素空間,觀察 feature map 對哪些 pattern 響應最大,即卷積結果受到哪部分的影響最大。 # 2. 上池化(Unpooling)
池化(Pooling)操作通常用於將輸入特征圖縮小一半,達到篩選重要特征的作用。
**上池化(Unpooling)** 是在 CNN 中常用的來表示 max pooling 的逆操作。這是論文《Visualizing and Understanding Convolutional Networks》中產生的思想,下圖示意: 反卷積和上池化效果對比:

- b,d,f,h,j 為反卷積結果- c,e,g,i 為上池化結果 # 3. 上采樣(Upsampling)
在 FCN、U-net 等網絡結構中,涉及到了上采樣。上采樣概念:**上采樣指的是任何可以讓圖像變成更高分辨率的技術**。最簡單的方式是 重采樣 和 插值:將輸入圖片進行 rescale 到一個想要的尺寸,並計算每個點的像素值,使用如雙線性插值等插值方法對其余點進行插值來完成上采樣過程。 對比上采樣和上池化的示意圖,可以發現區別:
- 上采樣(UnSampling)沒有使用 MaxPooling 時的位置信息,而是直接通過內容的復制來擴充 Feature Map。- 上池化(UnPooling)過程在 Maxpooling 時保留了最大值的位置信息,之后在上池化時使用該位置信息擴充 Feature Map,除最大值位置以外,其余位置補 0。 參考文章: https://blog.csdn.net/qq_27871973/article/details/82973048
http://www.360doc.com/content/19/0507/12/57110788_834069126.shtml
