3 回答
TA贡献2039条经验 获得超7个赞
我举一个例子来说明一点:
x:输入形状[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.]
TA贡献1797条经验 获得超6个赞
如果你喜欢ascii art:
"VALID" =没有填充:
inputs: 1 2 3 4 5 6 7 8 9 10 11 (12 13)
|________________| dropped
|_________________|
"SAME" =零填充:
pad| |pad
inputs: 0 |1 2 3 4 5 6 7 8 9 10 11 12 13|0 0
|________________|
|_________________|
|________________|
在这个例子中:
输入宽度= 13
滤镜宽度= 6
步幅= 5
笔记:
"VALID" 只会丢掉最右边的列(或最底部的行)。
"SAME" 尝试向左和向右均匀填充,但如果要添加的列数是奇数,它将向右添加额外的列,如本示例中的情况(相同的逻辑垂直应用:可能有一个额外的行在底部的零)。
编辑:
关于这个名字:
使用"SAME"填充,如果使用步幅1,则图层的输出将具有与其输入相同的空间维度。
使用"VALID"填充,没有“补充”填充输入。该图层仅使用有效的输入数据。
TA贡献1810条经验 获得超4个赞
当stride
为1时(更常见的是卷积而不是合并),我们可以想到以下区别:
"SAME"
:输出大小与输入大小相同。这需要过滤器窗口在输入映射外滑动,因此需要填充。"VALID"
:过滤器窗口保持在输入映射内的有效位置,因此输出大小缩小filter_size - 1
。没有填充。
添加回答
举报