恢復特征圖分辨率的方式對比:反卷積,上池化,上采樣


恢復特征圖分辨率的方式對比:反卷積,上池化,上采樣

文章目錄

  • 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. 像素級分割,需要將圖像尺寸恢復到原本的大小;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 到一個想要的尺寸,並計算每個點的像素值,使用如雙線性插值等插值方法對其余點進行插值來完成上采樣過程。 對比上采樣和上池化的示意圖,可以發現區別:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM