之前深度學習中一般只在卷積中涉及到padding:
tf.nn.conv2d(x,W,strides=[1,1,1,1],padding="SAME")
現在在Tensorflow學習過程中,發現在池化過程中,大量應用到SAME填充:
tf.nn.max_pool(x,[1,2,2,1],strides=[1,2,2,1],padding="SAME")
現在我們來看看池化過程中padding到底是如何工作的?
卷積填充了解:http://www.ai-start.com/dl2017/html/lesson4-week1.html
參考:https://blog.csdn.net/sky_asher/article/details/79704262
一:池化層SAME Padding
(一)案例一:可被池化層filter整除
a = tf.get_variable('w', shape=(1,4,4,1), initializer=tf.truncated_normal_initializer(seed=1)) b = tf.nn.max_pool(a, ksize=[1,2,2,1], strides=[1,2,2,1], padding='VALID') c = tf.nn.max_pool(a, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) out_b = sess.run(b) out_c = sess.run(c) print(out_b.shape, out_c.shape)
在這里剛好是4 % 2 = 0,也就是池化的模板的長度能夠待處理的數據長度整除,所以兩者的結果是相同的。
(二)案例二:不可被池化層filter整除
a = tf.get_variable('w', shape=(1,3,3,1), initializer=tf.truncated_normal_initializer(seed=1)) b = tf.nn.max_pool(a, ksize=[1,2,2,1], strides=[1,2,2,1], padding='VALID') c = tf.nn.max_pool(a, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) out_b = sess.run(b) out_c = sess.run(c) print(out_b.shape, out_c.shape)
這里就不一樣了,因為模板在滑動時,可能存在覆蓋不完全的地方,就比如用2*2的模板,對於VALID模式和SAME模式就不一樣,SAME模式會補全橙色部分,而VALID模式就不會補全了
VALID不進行填充:會有數據無法遍歷
SAME會向左和下填充0(這里不同與卷積的處理):但是都會使得原矩陣中的數據被遍歷到
二:實例說明
same會根據具體的步長和核大小去盡量遍歷特征圖,因為可以填充這個周邊的范圍。
(一)代碼演示
x = tf.constant([[1., 2., 3., 5.], [4., 5., 6., 6.], [1 , 2 , 3 , 4 ], [6 , 5 , 8 , 9 ]]) x = tf.reshape(x, [1, 4, 4, 1]) valid_pad = tf.nn.max_pool(x, [1, 3, 3, 1], [1, 2, 2, 1], padding='VALID') same_pad = tf.nn.max_pool(x, [1, 3, 3, 1], [1, 2, 2, 1], padding='SAME') with tf.Session() as sess: print(sess.run(valid_pad)) print("----------") print(sess.run(same_pad))
(二)Valid填充
(三)Same填充
補充:argmax中axis問題
https://blog.csdn.net/qq575379110/article/details/70538051/