您的位置:首页 > 其它

tensorflow_conv2d_max_pool卷积池化padding参数为SAME和VALID的区别

2017-06-26 19:48 549 查看
卷积:conv2

"VALID"
= without padding:

inputs:         1  2  3  4  5  6  7  8  9  10 11 (12 13)
|________________|                dropped
|_________________|
[/code]

"SAME"
= with zero padding:

pad|                                      |pad
inputs:      0 |1  2  3  4  5  6  7  8  9  10 11 12 13|0  0
|________________|
|_________________|
|________________|
[/code]

In this example:

Input width = 13
Filter width = 6
Stride = 5
"VALID"
only ever drops the right-most columns (or bottom-most rows).
"SAME"
tries to pad evenly left and right, but if the amount of columns to be added is odd, it will add the extra column to the right, as is the case in this example (the same logic applies vertically: there may
be an extra row of zeros at the bottom).

The
TensorFlow Convolution example gives an overview about the difference between
SAME
and
VALID
:

For the
SAME
padding, the output height and width are computed as:

out_height = ceil(float(in_height) / float(strides[1]))

out_width = ceil(float(in_width) / float(strides[2]))

And

For the
VALID
padding, the output height and width are computed as:

out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))

out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))

池化:max_pool
I'll give an example to make it clearer:

x
: input image of shape [2, 3], 1 channel
valid_pad
: max pool with 2x2 kernel, stride 2 and VALID padding.
same_pad
: max pool with 2x2 kernel, stride 2 and SAME padding (this is the
classic way to go)

The output shapes are:

valid_pad
: here, no padding so the output shape is [1, 1]
same_pad
: here, we pad the image to the shape [2, 4] (with
-inf
and then apply max pool), so the output shape is [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.]
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: