1. 程式人生 > 實用技巧 >為什麼做卷積之前要對影象進行padding操作(根據過濾器的大小來padding)?

為什麼做卷積之前要對影象進行padding操作(根據過濾器的大小來padding)?

參考文章:

  1. 吳恩達-深度學習-卷積神經網路-Padding 筆記

在這裡插入圖片描述
如果你用一個3×3的過濾器 卷積 一個6×6的影象,你最後會得到一個4×4的輸出,也就是一個4×4矩陣。那是因為你的3×3過濾器在6×6矩陣中,只可能有4×4種可能的位置

這背後的數學解釋是,如果我們有一個的影象,用的過濾器做卷積,那麼
輸出的維度就是(n-f+1)*(n-f+1)
在這個例子裡是6-3+1=4,因此得到了一個4×4的輸出。

這樣的話會有兩個缺點:

第一個缺點是,每次做卷積操作,你的影象就會縮小,從6×6縮小到4×4,你可能做了幾次之後,你的影象就會變得很小了,可能會縮小到只有1×1的大小。你可不想讓你的影象在每次識別邊緣或其他特徵時都縮小

,這就是第一個缺點。當我們建立深度神經網路時,你就會知道你為什麼不希望每進行一步操作影象都會縮小。比如當你有100層深層的網路,如果影象每經過一層都縮小的話,經過100層網路後,你就會得到一個很小的影象。

第二個缺點是,如果你注意角落邊緣的畫素,這個畫素點(綠色陰影標記)只被一個過濾器輸出所觸碰或者使用,因為它位於這個3×3的區域的一角。但如果是在中間的畫素點,比如這個(紅色方框標記),就會有許多3×3的區域與之重疊。所以那些在角落或者邊緣區域的畫素點在輸出中採用較少,意味著你丟掉了影象邊緣位置的許多資訊
在這裡插入圖片描述


在這裡插入圖片描述

為了解決這些問題,你可以在卷積操作之前填充這幅影象。在這個案例中,你可以沿著影象邊緣再填充一層畫素

。如果你這樣操作了,那麼6×6的影象就被你填充成了一個8×8的影象。如果你用3×3的影象對這個8×8的影象卷積,你得到的輸出就不是4×4的,而是6×6的影象,你就得到了一個尺寸和原始影象6×6的影象。習慣上,你可以用0去填充,如果是填充的數量,在這個案例中,p = 1,因為我們在周圍都填充了一個畫素點輸出也就變成了(n+2p-f+1)*(n+2p-f+1),所以就變成了(6+21-3+1)(6+21-3+1)=66,和輸入的影象一樣大。這個塗綠的畫素點(左邊矩陣)影響了輸出中的這些格子(右邊矩陣)。這樣一來,丟失資訊或者更準確來說角落或影象邊緣的資訊發揮的作用較小的這一缺點就被削弱了。

剛才我已經展示過用一個畫素點來填充邊緣,如果你想的話,也可以填充兩個畫素點,也就是說在這裡填充一層。實際上你還可以填充更多畫素。我這裡畫的這種情況,填充後。
在這裡插入圖片描述
至於選擇填充多少畫素,通常有兩個選擇,分別叫做Valid卷積和Same卷積

  1. Valid卷積意味著不填充,這樣的話,如果你有一個nn的影象,用一個ff的過濾器卷積,它將會給你一個(n-f+1)*(n-f+1)維的輸出。這類似於我們在前面的視訊中展示的例子,有一個6×6的影象,通過一個3×3的過濾器,得到一個4×4的輸出。
  2. 另一個經常被用到的填充方法叫做Same卷積,那意味你填充後,你的輸出大小和輸入大小是一樣的。根據這個公式n-f+1,當你填充個畫素點,n就變成了n+2p,最後公式變為n+2p-f+1。因此如果你有一個nn的影象,用p個畫素填充邊緣,輸出的大小就是這樣的(n+2p-f+1)(n+2p-f+1)。如果你想讓n+2p-f+1=n的話,使得輸出和輸入大小相等,如果你用這個等式求解p,那麼p =(f-1)/2。所以當f是一個奇數的時候,只要選擇相應的填充尺寸,你就能確保得到和輸入相同尺寸的輸出。這也是為什麼前面的例子,當過濾器是3×3時,和上一張幻燈片的例子一樣,使得輸出尺寸等於輸入尺寸,所需要的填充是(3-1)/2,也就是1個畫素。另一個例子,當你的過濾器是5×5,如果f=5,然後代入那個式子,你就會發現需要2層填充使得輸出和輸入一樣大,這是過濾器5×5的情況。

習慣上,計算機視覺中,f通常是奇數,甚至可能都是這樣。你很少看到一個偶數的過濾器在計算機視覺裡使用,我認為有兩個原因。

  1. 其中一個可能是,如果是一個偶數,那麼你只能使用一些不對稱填充。只有f是奇數的情況下,Same卷積才會有自然的填充,我們可以以同樣的數量填充四周,而不是左邊填充多一點,右邊填充少一點,這樣不對稱的填充。
  2. 第二個原因是當你有一個奇數維過濾器,比如3×3或者5×5的,它就有一箇中心點。有時在計算機視覺裡,如果有一箇中心畫素點會更方便,便於指出過濾器的位置

另一篇文章:【卷積核的大小一般為奇數奇數】 11,33,55,7*7都是最常見的。這是為什麼呢?為什麼沒有偶數×偶數?

(1)更容易padding
在卷積時,我們有時候需要卷積前後的尺寸不變。這時候我們就需要用到padding。假設影象的大小,也就是被卷積物件的大小為nn,卷積核大小為kk,padding的幅度設為(k-1)/2時,卷積後的輸出就為(n-k+2*((k-1)/2))/1+1=n,即卷積輸出為n*n,保證了卷積前後尺寸不變。但是如果k是偶數的話,(k-1)/2就不是整數了
(2)更容易找到卷積錨點
在CNN中,進行卷積操作時一般會以卷積核模組的一個位置為基準進行滑動,這個基準通常就是卷積核模組的中心若卷積核為奇數,卷積錨點很好找,自然就是卷積模組中心,但如果卷積核是偶數,這時候就沒有辦法確定了,讓誰是錨點似乎都不怎麼好。