CNN概念之上採樣,反捲積,Unpooling概念解釋

前言

本文譯自quora上對《What is the difference between Deconvolution, Upsampling, Unpooling, and Convolutional Sparse Coding?》的回答。個人覺得這位老哥的回答很簡潔幹練。所以轉到這裏。

Upsampling(上採樣)

在FCN、U-net等網絡結構中,我們見識到了上採樣這個東西。那麼,什麼是上採樣呢?簡單來說:上採樣指的是任何可以讓你的圖像變成更高分辨率的技術

最簡單的方式是重採樣和插值:將輸入圖片進行rescale到一個想要的尺寸,而且計算每個點的像素點,使用如雙線性插值等插值方法對其餘點進行插值來完成上採樣過程。

Unpooling

Unpooling是在CNN中常用的來表示max pooling的逆操作。這是從2013年紐約大學Matthew D. Zeiler和Rob Fergus發表的《Visualizing and Understanding Convolutional Networks》中產生的idea:

鑑於max pooling不可逆,因此使用近似的方式來反轉得到max pooling操作之前的原始情況

簡單來說,記住做max pooling的時候的最大item的位置,比如一個3x3的矩陣,max pooling的size爲2x2,stride爲1,反捲積記住其位置,其餘位置至爲0就行:

[123456789]>(maxpooling)[5689]>(unpooling)[000056089]

Deconvolution(反捲積)

Deconvolution(反捲積)在CNN中常用於表示一種反向卷積 ,但它並不是一個符合嚴格數學定義的反捲積操作。與Unpooling不同,使用反捲積來對圖像進行上採樣是可以習得的。通常用來對卷積層的結果進行上採樣,使其回到原始圖片的分辨率。

反捲積也被稱爲分數步長卷積(convolution with fractional strides)或者轉置卷積(transpose convolution)或者後向卷積(backwards strided convolution)。作者認爲應該稱之爲轉置卷積

真正的反捲積如(Deconvolution - Wikipedia)裏面所說,但是我不認爲有人在實際的CNN中會使用它。

前面提到,反捲積也被稱爲分數步長卷積或者轉置卷積或者後向卷積。在我看來,這些術語不會讓人真正的理解到底發生了什麼,而實際上這些東西還是挺簡單的。

常規的卷積操作(valid模式):滑動步長爲S,圖片大小爲N1xN1,卷積核大小爲N2xN2(示意圖假設爲3x3),卷積後圖像大小:(N1-N2)/S+1 x (N1-N2)/S+1如下圖:

這裏寫圖片描述
爲了要讓經過卷積的結果回到卷積前的模樣。如圖這個2x2的的結果,如何回到4x4呢?其實這種也算一種卷積的操作,只不過進行了padding操作:
這裏寫圖片描述

或者,通常大家會選擇更大的stride來增強上採樣的效果(因爲一般默認stride=1,比較小)
這裏寫圖片描述

上面這種圖的地址:https://github.com/vdumoulin/conv_arithmetic,需要注意的是:上採樣的kernel的學習與正常的卷積核類似

FCN(U-net)中的low-level和high-level特徵的融合

在FCN論文中,作者採用了combine網絡的low-level和high-level特徵的方式。這是因爲:

網絡比較深的時候,特徵圖通常比較小,對這種特徵圖進行上採樣——有很好的語義信息,但分辨率很差。
網絡比較淺的時候,特徵圖通常比較大(接近input image),對這種特徵圖進行上採樣——有很好的細節,但語義信息很差。

因此,對兩者進行combine,我們可以在得到很好的細節基礎上,也能獲得儘可能強的圖像語義信息


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