定义几个参数
- 输入图片大小 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