1. 程式人生 > >Tensorflow中CNN採用padding='same'時補零位置、卷積核位置

Tensorflow中CNN採用padding='same'時補零位置、卷積核位置

首先關於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使用這種方式,可以最大程度地使卷積核中心點對應資料點。