1. 程式人生 > >卷積運算中的兩種padding的取值,VALID和SAME

卷積運算中的兩種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,沒什麼問題,如下: