TensorFlow演示反捲積的操作
阿新 • • 發佈:2019-01-07
一 反捲積函式介紹1 語法格式def conv2d_transpose(value,filter,output_shape,strides,padding="SAME",data_format="NHWC",name=None):2 引數說明value:代表通過卷積操作之後的張量,一般為NHWC型別。filter:代表卷積核。output_shape:代表輸出的張量形狀也是個四維張量。strides:代表步長。padding:代表原資料生成value時使用的補0的方式,是用來檢查輸入形狀和輸出形狀是否合規的。3 返回值反捲積後的結果,按照output_shape指定的形狀。注意:NHWC型別是神經網路中處理影象方面常用的型別,4個字母分別代表4個意思,即N——個數、H——高、W——寬、C——通道數。也就是我們常見的四維張量。二 實戰 1 例項描述通過對模擬資料進行卷積操作和反捲積操作,來比較卷積與反捲積中padding在SAME、VALID下的變化。2 程式碼 [[-2.], [-2.]]]], dtype=float32), array([[[[ 1.]],[[ 0.]]], [[[-1.]], [[-2.]]]], dtype=float32)]cons:[array([[[[-2.], [-2.]], [[-2.], [-2.]]]], dtype=float32)]contv:[array([[[[-2.], [ 0.],[-2.],[ 0.]], [[ 2.], [ 4.], [ 2.], [ 4.]], [[-2.], [ 0.],[-2.],[ 0.]], [[ 2.], [ 4.], [ 2.],[ 4.]]]], dtype=float32)]conts:[array([[[[-2.],[ 0.], [-2.], [ 0.]], [[ 2.],[ 4.], [ 2.], [ 4.]], [[-2.],[ 0.], [-2.], [ 0.]], [[ 2.],[ 4.], [ 2.],[ 4.]]]], dtype=float32)]先定義一個[1,4,4,1]的矩陣,矩陣裡的值全為1,進行filter為2*2、步長為2*2的卷積操作,分別使用padding為SAME和VALID的兩種情況生成卷積資料,然後將結果放到conv2d_transpose裡,再次使用padding為SAME和VALID的兩種情況生成資料。可以看出輸出的結果與上圖是一樣的,並且也驗證了當padding為SAME並且不需要補0時,卷積和反捲積對於padding是SAME和VALID都是相同的。
3 執行結果(1, 2, 2, 1)(1, 2, 2, 1)conv:[array([[[[-2.], [-2.]], [[-2.], [-2.]]]], dtype=float32), array([[[[ 1.]], [[ 0.]]], [[[-1.]], [[-2.]]]], dtype=float32)]cons:[array([[[[-2.], [-2.]], [[-2.], [-2.]]]], dtype=float32)]contv:[array([[[[-2.], [ 0.], [-2.], [ 0.]], [[ 2.], [ 4.], [ 2.], [ 4.]], [[-2.], [ 0.], [-2.], [ 0.]], [[ 2.], [ 4.], [ 2.], [ 4.]]]], dtype=float32)]conts:[array([[[[-2.], [ 0.], [-2.], [ 0.]], [[ 2.], [ 4.], [ 2.], [ 4.]], [[-2.], [ 0.], [-2.], [ 0.]], [[ 2.], [ 4.], [ 2.], [ 4.]]]], dtype=float32)]4 執行說明為了便於觀察,先整理一下結果conv:[array([[[[-2.],[-2.]],import tensorflow as tf ''' 模擬資料 ''' img = tf.Variable(tf.constant(1.0,shape = [1, 4, 4, 1])) filter = tf.Variable(tf.constant([1.0,0,-1,-2],shape = [2, 2, 1, 1])) ''' 分別進行VALID與SAME操作 ''' conv = tf.nn.conv2d(img, filter, strides=[1, 2, 2, 1], padding='VALID') cons = tf.nn.conv2d(img, filter, strides=[1, 2, 2, 1], padding='SAME') print(conv.shape) print(cons.shape) ''' 再進行反捲積 ''' contv= tf.nn.conv2d_transpose(conv, filter, [1,4,4,1],strides=[1, 2, 2, 1], padding='VALID') conts = tf.nn.conv2d_transpose(cons, filter, [1,4,4,1],strides=[1, 2, 2, 1], padding='SAME') with tf.Session() as sess: sess.run(tf.global_variables_initializer() ) print("conv:\n",sess.run([conv,filter])) print("cons:\n",sess.run([cons])) print("contv:\n",sess.run([contv])) print("conts:\n",sess.run([conts]))