定義幾個參數
- 輸入圖片大小 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