卷积运算中的两种padding的取值,VALID和SAME

模板来源于(https://blog.csdn.net/wuzqchom/article/details/74785643) 加入了一些自己的理解

在用tensorflow写CNN的时候,调用卷积核api的时候,会有填padding方式的参数,找到源码中的函数定义如下(max pooling也是一样):

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,
           data_format=None, name=None)


源码中对于padding参数的说明如下:

padding: A `string` from: `"SAME", "VALID"`.
      The type of padding algorithm to use.

源码中说明padding可以用SAMEVALID两种方式,但是对于这两种方式具体是什么并没有多加说明。

我们来对这两种用法进行分析:(代码如下)

import tensorflow as tf 
x0 = tf.constant([[1., 2., 3.],
                 [4., 5., 6.]])

x = tf.reshape(x0,[1,2,3,1])

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')

print(valid_pad.get_shape())
print(same_pad.get_shape())

with tf.Session() as sess:
    print(sess.run(valid_pad))
    print('--------------------------')
    print(sess.run(same_pad))

我们来看一下输出的结果


(1, 1, 1, 1)
(1, 1, 2, 1)
[[[[5.]]]]
--------------------------
[[[[5.]
   [6.]]]]

使用VALID模式,则我们的输出为(1x1)

使用SAME模式,得到的输出则是(1x2)

可以看出SAME的填充方式是比VALID的填充方式多了一列。
让我们来看看变量x xx是一个2×3 2\times32×3的矩阵,max pooling窗口为2×2 2\times22×2,两个维度的步长strides=2 strides=2strides=2。
第一次由于窗口可以覆盖,橙色区域做max pooling,没什么问题,如下:

 

 


 

猜你喜欢

转载自blog.csdn.net/Pierce_KK/article/details/83065212