定義幾個參數
- 輸入圖片大小 W×W
- Filter大小 F×F
- 步長 S
- padding的像素數 P
首先講tensorflow中

SAME: ceil(5/2)=3
VAILD
p = 0
(5-3+0)/2+1 = 2
卷積中的參數“SAME”,和‘VALID’決定了輸出尺寸的計算公式:
如果參數是‘’SAME'',那么計算只與步長有關,直接除以步長(除不盡,向上取整)
如果參數是‘VALID’,那么計算公式如上:N = (W − F + 2P )/S+1
這里對比max_pooling中的SAME VALID
在我看來,'VALID'意味着做最大池時,邊外沒有零填充。
根據A guide to convolution arithmetic for deep learning,它表示池化操作符中沒有填充,即只使用tensorflow的'VALID'。但是什么是tensorflow中最大池的'SAME'填充?
最佳解決方案
我舉一個例子來說明一點:
x:shape[2,3],1通道的輸入圖像
valid_pad:具有2x2內核,步幅2和VALID填充的最大池化。
same_pad:最大池化,2x2內核,步幅2和SAME填充(這是經典的方法)
輸出形狀為:
valid_pad:這里沒有填充,所以輸出形狀為[1,1]
same_pad:在這里,我們將圖像填充到形狀[2,4](使用-inf,然后應用最大池化),因此輸出形狀為[1,2]
x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
x = tf.reshape(x, [1, 2, 3, 1]) # give a shape accepted by tf.nn.max_pool
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
valid_pad.get_shape() == [1, 1, 1, 1] # valid_pad is [5.]
same_pad.get_shape() == [1, 1, 2, 1] # same_pad is [5., 6.]
其次講pytorch中
最后講理論推導:
N = (W − F + 2P )/S+1
輸出圖片大小為 N×N
