理解tensorflow中convolution和padding的維度變化


類神經網路進行convolution或pooling時,一定會遇到padding計算的問題,在經過不同大小的stride和kernel後,output的維度常常令人一知半解,在此筆記自己的理解。

Tensorflow關於padding有兩種設定,一種是SAME,另一種是VALID

1. VALID

Valid的想法很直觀,我們讓kernel在input上以s步長(strides)滑動,進行計算,同時保持kernel所覆蓋的範圍不能超出input。

因此計算上簡單的想法是,input size先扣掉最尾端的kernel size,剩餘的部份+1就是kernel anchor可以進行滑動的範圍。如果此範圍可以被strides整除,那就皆大歡喜。如果此範圍無法被strides整除,就代表剩餘的部份一定可以再放一個kernel。因此我們用取ceiling表達最後的output size。

VALID狀況下的output size計算公式:
\begin{equation}
\left \lceil{\frac{n_i – k + 1}{s}}\right \rceil = n_o
\end{equation}

2. SAME

Same的output size定義是這樣子的,

SAME狀況下的output size計算公式:
\begin{equation}
n_o = \left \lceil{\frac{n_i}{s}}\right \rceil
\end{equation}
如果設定為same,output size並不受kernel size影響,因為不管kernel size多大,都會自動補滿計算。唯一會影響output size的是步長,步長越大,output size就會按照比例縮小。

通常搞懂上面兩個公式,就可以了解網路架構的size在通過convolution和pooling之後會如何改變,剩下的細節問題會是:那Same怎麼知道要補多少padding,而且padding要怎麼補?
繼續閱讀 理解tensorflow中convolution和padding的維度變化