最近在看yolo、ssd算法的時候總是接觸到一個詞叫做上采樣.
一直沒太搞懂到底什么是上采樣,今天正好查了下,然后來記錄下來
上采樣
簡單的理解就是把圖片進行放大了。在算法中,在我們做圖像識別過程中,需要對圖像進行像素級別的分類,因此在卷積提取特征后需要通過上采樣將feature map 還原到原圖中。
在算法中常見的上采樣方法有雙線性插值以及轉(zhuǎn)置卷積、上采樣(unsampling)和上池化(unpooling).
常用的就是雙線性插值以及轉(zhuǎn)置卷積
雙線性插值
雙線性插值,又稱為雙線性內(nèi)插。在數(shù)學(xué)上,雙線性插值是對線性插值在二維直角網(wǎng)格上的擴展,用于對雙變量函數(shù)(例如 x 和 y)進行插值。其核心思想是在兩個方向分別進行一次線性插值。
假設(shè)我們想得到未知函數(shù) f 在點 P = (x, y) 的值,假設(shè)我們已知函數(shù) f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四個點的值。
首先在 x 方向進行線性插值,得到:

然后在 y 方向進行線性插值,得到 f(x, y):

轉(zhuǎn)置卷積
轉(zhuǎn)置卷積和線性插值不同的是需要一個學(xué)習(xí)參數(shù)
想明白轉(zhuǎn)置卷積就必須先明白什么是卷積操作
我們從一個小例子中直觀的感受下什么是卷積操作,假設(shè)我們有個44的矩陣,我們在這個矩陣上去做33的卷積操作,在stride=1的時候,而且不添加padding的情況下。就可以輸出一個2*2 的矩陣

一個卷積操作就是一個多對一的映射關(guān)系。
反過來操作
現(xiàn)在,假設(shè)我們想要反過來操作。我們想要將輸入矩陣中的一個值映射到輸出矩陣的9個值,這將是一個一對多(one-to-many)的映射關(guān)系。這個就像是卷積操作的反操作,其核心觀點就是用轉(zhuǎn)置卷積。

卷積矩陣

我們對這個卷積矩陣進行重新排列得到4*16的矩陣

每一個卷積矩陣的行都是經(jīng)過重新排列的,每行之間用0進行填充。

為了方便乘法我們將輸入的矩陣進行向量變化,從4 * 4變?yōu)?6 * 1的形狀

通過矩陣乘法我們得到一個輸出向量

通過變換得到2*2 的矩陣

從圖中我們發(fā)現(xiàn),我們可以實現(xiàn)矩陣的從16到4 其實也就是
下采樣就是圖像的縮小的過程。
我們掌握了從16到4的過程,相同的原理我們也就知道了從4到16
轉(zhuǎn)置卷積矩陣
我們想要從4到16,因此我們要使用一個16 * 4的矩陣
假設(shè)我們轉(zhuǎn)置這個卷積矩陣變成了
然后做一個列向量的
進行矩陣的乘法,從而生成一個
的輸出矩陣

這樣就輸出了一個 的矩陣
需要注意的是:這里的轉(zhuǎn)置卷積矩陣的參數(shù),不一定從原始的卷積矩陣中簡單轉(zhuǎn)置得到的,轉(zhuǎn)置這個操作只是提供了轉(zhuǎn)置卷積矩陣的形狀而已。
unsampling和unpooling

其中右側(cè)為unsampling,可以看出unsampling就是將輸入feature map中的某個值映射填充到輸出上采樣的feature map的某片對應(yīng)區(qū)域中,而且是全部填充的一樣的值。

unpooling的操作與unsampling類似,區(qū)別是unpooling記錄了原來pooling是取樣的位置,在unpooling的時候?qū)⑤斎雈eature map中的值填充到原來記錄的位置上,而其他位置則以0來進行填充。