1. 程式人生 > >TensorFlow演示反捲積的操作

TensorFlow演示反捲積的操作

一 反捲積函式介紹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 程式碼
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]))
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.]],
        [[-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都是相同的。