Tensorflow中CNN採用padding='same'時補零位置、卷積核位置
阿新 • • 發佈:2019-01-14
首先關於padding='same'的理解請參考TensorFlow中CNN的兩種padding方式“SAME”和“VALID”
那麼問題是,在採用padding='same'補零時,補零位置怎樣分配?卷積核kernel的位置又在哪呢(與資料點如何對應)?
太長不看傳送門:結論
(tensorflow version1.11.0)
資料長度為4,卷積核長度為3,步長為1,採用padding='same'補零時:
第一種可能——在資料末尾(或前端)補零,卷積核首位對應資料點
第二種可能——在資料兩端補零,卷積核中心點對應資料點
import tensorflow as tf inputs = tf.constant([1, 2, 3, 4], tf.float32) inputs = tf.reshape(inputs, [1, 4, 1]) cnn = tf.layers.conv1d( inputs=inputs, filters=1, kernel_size=3, strides=1, padding='same', kernel_initializer='ones' ) with tf.Session() as sess: tf.global_variables_initializer().run() output = sess.run(cnn) print(output.reshape(-1))
設計一個實驗,資料為[1, 2, 3, 4], 指定卷積核為[1, 1, 1]
結果是:
3 = 1*0+1*1+1*2,6=1*1+1*2+1*3,9=1*2+1*3+1*4,7=1*3+1*4+1*0
說明是在資料兩端補零,卷積核中心點對應資料點。
資料長度為4,卷積核長度為2,步長為1,採用padding='same'補零時:
第一種可能:在資料末尾補零,卷積核首位對應資料點
第二種可能:在資料前端補零,卷積核末位對應資料點
import tensorflow as tf inputs = tf.constant([1, 2, 3, 4], tf.float32) inputs = tf.reshape(inputs, [1, 4, 1]) cnn = tf.layers.conv1d( inputs=inputs, filters=1, kernel_size=2, strides=1, padding='same', kernel_initializer='ones' ) with tf.Session() as sess: tf.global_variables_initializer().run() output = sess.run(cnn) print(output.reshape(-1))
設計一個實驗,資料為[1, 2, 3, 4], 指定卷積核為[1, 1]
結果是:
3=1*1+1*2,5=1*2+1*3,7=1*3+1*4,4=1*4+1*0
說明是在資料末尾補零,卷積核首位對應資料點。
!!!但是在實際中,情況更為複雜,請參考下面的結論:
結論
Tensorflow使用這種方式,可以最大程度地使卷積核中心點對應資料點。