一 反卷積函式介紹
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 ...