TensorFlow演示反卷積的操作

2021-08-19 22:30:13 字數 3606 閱讀 4220

一 反卷積函式介紹

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都是相同的。

反卷積實現 tensorflow 實現

deconv解卷積,實際是叫做conv transpose,conv transpose實際是卷積的乙個逆向過程,tf中,編寫conv transpose 的時候,心中想著乙個正向的卷積過程會很有幫助。想象一下我們有乙個正向卷積 input shape 1,5,5,3 kernel shape 2,...

tensorflow實現卷積與反卷積自編碼框架

從dcgan中了解到了反卷積的操作,所以我本來打算能通過卷積操作作為編碼器將一幀影象轉換為乙個20維的向量,而後再通過反卷積實現解碼功能從而達到影象恢復效果,先把程式貼上,後續有空再調整網路層數和引數吧 from tensorflow.examples.tutorials.mnist import ...

卷積和反卷積

n image h 2 pad h kernel h stride h 1 image w 2 pad w kernel w stride w 1 image h 輸入影象的高度 image w 輸入影象的寬度 pad h 在輸入影象的高度方向兩邊各增加pad h個單位長度 因為有兩邊,所以乘以2 ...