什么是'SAME'和'VALID'填充之间的区别在tf.nn.max_pool
的tenorflow
?
在我看来,“VALID”意味着在执行max pool时,边缘外不会有零填充。
如果你喜欢ascii艺术:
>
“有效”
=无填充:
inputs: 1 2 3 4 5 6 7 8 9 10 11 (12 13)
|________________| dropped
|_________________|
“相同”
=零填充:
pad| |pad
inputs: 0 |1 2 3 4 5 6 7 8 9 10 11 12 13|0 0
|________________|
|_________________|
|________________|
在这个例子中:
笔记:
“VALID”
只删除最右边的列(或最下面的行)李> “SAME”
尝试左右均匀填充,但如果要添加的列数为奇数,则会将额外的列添加到右侧,如本例所示(相同的逻辑垂直应用:底部可能有额外的一行零)李>关于姓名:
“SAME”
填充,如果使用1的步幅,层的输出将具有与其输入相同的空间尺寸李> “VALID”
填充时,没有“虚构”的填充输入。图层仅使用有效的输入数据李>
当stride
为1时(卷积比池更典型),我们可以考虑以下区别:
"SAME"
:输出大小与输入大小相同。这需要过滤器窗口滑出输入映射,因此需要垫。"VALID"
:过滤器窗口停留在输入映射内的有效位置,因此输出大小缩小filter_size-1
。没有填充发生。
我举个例子让它更清楚:
x
:输入形状的图像[2,3],1通道valid_pad
:带2x2内核、步幅2和VALID填充的最大池。
same_pad
:最大池与2x2内核,步幅2和SAME填充(这是经典的方式去)输出形状为:
valid\u pad
:此处没有填充,因此输出形状为[1,1]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.]