欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TensorFlow tf.nn.conv2d_transpose是怎樣實現(xiàn)反卷積的

 更新時間:2020年04月20日 11:31:57   作者:xf__mao  
這篇文章主要介紹了TensorFlow tf.nn.conv2d_transpose是怎樣實現(xiàn)反卷積的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

今天來介紹一下Tensorflow里面的反卷積操作,網(wǎng)上反卷積的用法的介紹比較少,希望這篇教程可以幫助到各位

反卷積出自這篇論文:Deconvolutional Networks,有興趣的同學自行了解

首先無論你如何理解反卷積,請時刻記住一點,反卷積操作是卷積的反向

如果你隨時都記住上面強調的重點,那你基本就理解一大半了,接下來通過一些函數(shù)的介紹為大家強化這個觀念

conv2d_transpose(value, filter, output_shape, strides, padding="SAME", data_format="NHWC", name=None)

除去name參數(shù)用以指定該操作的name,與方法有關的一共六個參數(shù):
第一個參數(shù)value:指需要做反卷積的輸入圖像,它要求是一個Tensor
第二個參數(shù)filter:卷積核,它要求是一個Tensor,具有[filter_height, filter_width, out_channels, in_channels]這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,卷積核個數(shù),圖像通道數(shù)]
第三個參數(shù)output_shape:反卷積操作輸出的shape,細心的同學會發(fā)現(xiàn)卷積操作是沒有這個參數(shù)的,那這個參數(shù)在這里有什么用呢?下面會解釋這個問題
第四個參數(shù)strides:反卷積時在圖像每一維的步長,這是一個一維的向量,長度4
第五個參數(shù)padding:string類型的量,只能是"SAME","VALID"其中之一,這個值決定了不同的卷積方式
第六個參數(shù)data_format:string類型的量,'NHWC'和'NCHW'其中之一,這是tensorflow新版本中新加的參數(shù),它說明了value參數(shù)的數(shù)據(jù)格式。'NHWC'指tensorflow標準的數(shù)據(jù)格式[batch, height, width, in_channels],'NCHW'指Theano的數(shù)據(jù)格式,[batch, in_channels,height, width],當然默認值是'NHWC'

開始之前務必了解卷積的過程,參考我的另一篇文章:http://www.dbjr.com.cn/article/177798.htm

首先定義一個單通道圖和3個卷積核

x1 = tf.constant(1.0, shape=[1,3,3,1])
kernel = tf.constant(1.0, shape=[3,3,3,1])

先別著急!我們不直接用反卷積函數(shù),而是再定義一些圖

x2 = tf.constant(1.0, shape=[1,6,6,3])
x3 = tf.constant(1.0, shape=[1,5,5,3])

x2是6×6的3通道圖,x3是5×5的3通道圖
好了,接下來對x3做一次卷積操作

y2 = tf.nn.conv2d(x3, kernel, strides=[1,2,2,1], padding="SAME")

所以返回的y2是一個單通道的圖,如果你了解卷積過程,很容易看出來y2是[1,3,3,1]的Tensor,y2的結果如下:

[[[[ 12.]
  [ 18.]
  [ 12.]]
 
 [[ 18.]
  [ 27.]
  [ 18.]]
 
 [[ 12.]
  [ 18.]
  [ 12.]]]]

又一個很重要的部分!tf.nn.conv2d中的filter參數(shù),是[filter_height, filter_width, in_channels, out_channels]的形式,而tf.nn.conv2d_transpose中的filter參數(shù),是[filter_height, filter_width, out_channels,in_channels]的形式,注意in_channels和out_channels反過來了!因為兩者互為反向,所以輸入輸出要調換位置

既然y2是卷積操作的返回值,那我們當然可以對它做反卷積,反卷積操作返回的Tensor,應該和x3的shape是一樣的(不難理解,因為是卷積的反過程)

y3 = tf.nn.conv2d_transpose(y2,kernel,output_shape=[1,5,5,3], strides=[1,2,2,1],padding="SAME")

好,現(xiàn)在返回的y3果然是[1,5,5,3]的Tensor,結果如下:

[[[[ 12. 12. 12.]
  [ 30. 30. 30.]
  [ 18. 18. 18.]
  [ 30. 30. 30.]
  [ 12. 12. 12.]]
 
 [[ 30. 30. 30.]
  [ 75. 75. 75.]
  [ 45. 45. 45.]
  [ 75. 75. 75.]
  [ 30. 30. 30.]]
 
 [[ 18. 18. 18.]
  [ 45. 45. 45.]
  [ 27. 27. 27.]
  [ 45. 45. 45.]
  [ 18. 18. 18.]]
 
 [[ 30. 30. 30.]
  [ 75. 75. 75.]
  [ 45. 45. 45.]
  [ 75. 75. 75.]
  [ 30. 30. 30.]]
 
 [[ 12. 12. 12.]
  [ 30. 30. 30.]
  [ 18. 18. 18.]
  [ 30. 30. 30.]
  [ 12. 12. 12.]]]]

這個結果是怎么得來的?可以用一張動圖來說明,圖片來源:反卷積的真正含義


看起來,tf.nn.conv2d_transpose的output_shape似乎是多余的,因為知道了原圖,卷積核,步長顯然是可以推出輸出圖像大小的,那為什么要指定output_shape呢?
看這樣一種情況:

y4 = tf.nn.conv2d(x2, kernel, strides=[1,2,2,1], padding="SAME")

我們把上面的x2也做卷積,獲得shape為[1,3,3,1]的y4如下:

[[[[ 27.]
  [ 27.]
  [ 18.]]
 
 [[ 27.]
  [ 27.]
  [ 18.]]
 
 [[ 18.]
  [ 18.]
  [ 12.]]]]

[1,6,6,3]和[1,5,5,3]的圖經(jīng)過卷積得到了相同的大小,[1,3,3,1]
讓我們再反過來看,那么[1,3,3,1]的圖反卷積后得到什么呢?產(chǎn)生了兩種情況。所以這里指定output_shape是有意義的,當然隨意指定output_shape是不允許的,如下情況程序會報錯:

y5 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,10,10,3],strides=[1,2,2,1],padding="SAME")

以上是stride為2的情況,為1時也類似,當卷積核大于原圖時,默認用VALID方式(用SAME就無意義了)參考下圖:

程序清單:

import tensorflow as tf
 
x1 = tf.constant(1.0, shape=[1,3,3,1])
 
x2 = tf.constant(1.0, shape=[1,6,6,3])
 
x3 = tf.constant(1.0, shape=[1,5,5,3])
 
kernel = tf.constant(1.0, shape=[3,3,3,1])
 
 
 
y1 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,6,6,3],
  strides=[1,2,2,1],padding="SAME")
 
y2 = tf.nn.conv2d(x3, kernel, strides=[1,2,2,1], padding="SAME")
 
y3 = tf.nn.conv2d_transpose(y2,kernel,output_shape=[1,5,5,3],
  strides=[1,2,2,1],padding="SAME")
 
y4 = tf.nn.conv2d(x2, kernel, strides=[1,2,2,1], padding="SAME")
 
'''
Wrong!!This is impossible
y5 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,10,10,3],strides=[1,2,2,1],padding="SAME")
'''
sess = tf.Session()
tf.global_variables_initializer().run(session=sess)
x1_decov, x3_cov, y2_decov, x2_cov=sess.run([y1,y2,y3,y4])
print(x1_decov.shape)
print(x3_cov.shape)
print(y2_decov.shape)
print(x2_cov.shape)

到此這篇關于TensorFlow tf.nn.conv2d_transpose是怎樣實現(xiàn)反卷積的 的文章就介紹到這了,更多相關TensorFlow tf.nn.conv2d_transpose 反卷積內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 構建高效的python requests長連接池詳解

    構建高效的python requests長連接池詳解

    這篇文章主要介紹了構建高效的python requests長連接池詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 利用Python實現(xiàn)顏色色值轉換的小工具

    利用Python實現(xiàn)顏色色值轉換的小工具

    最近一個朋友說已經(jīng)轉用Zeplin很久了。Zeplin的設計稿展示頁面的顏色色值使用十進制的 RGB 表示的,在 Android 中的顏色表示大多情況下都需要十六進制的 RGB 表示。所以想寫個工作,當輸入十進制的RGB ,得到十六進制的色值,最好可以方便復制。下面來一起看看吧。
    2016-10-10
  • python 使用csv模塊讀寫csv格式文件的示例

    python 使用csv模塊讀寫csv格式文件的示例

    這篇文章主要介紹了python 使用csv模塊讀寫csv格式文件的示例,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-12-12
  • 解決pip?install報錯:Cannot?connect?to?proxy問題

    解決pip?install報錯:Cannot?connect?to?proxy問題

    這篇文章主要介紹了解決pip?install報錯:Cannot?connect?to?proxy問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python隨機生成庫faker庫api實例詳解

    python隨機生成庫faker庫api實例詳解

    今天小編就為大家分享一篇python隨機生成庫faker庫api實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python基于pygame實現(xiàn)圖片代替鼠標移動效果

    Python基于pygame實現(xiàn)圖片代替鼠標移動效果

    這篇文章主要介紹了Python基于pygame實現(xiàn)圖片代替鼠標移動效果,可實現(xiàn)將鼠標箭頭轉換成圖形的功能,涉及pygame圖形操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Python多繼承順序實例分析

    Python多繼承順序實例分析

    這篇文章主要介紹了Python多繼承順序,結合實例形式分析了Python多繼承情況下繼承順序對同名函數(shù)覆蓋的影響,需要的朋友可以參考下
    2018-05-05
  • 解決jupyter notebook啟動后沒有token的坑

    解決jupyter notebook啟動后沒有token的坑

    這篇文章主要介紹了解決jupyter notebook啟動后沒有token的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python連接mongodb密碼認證實例

    python連接mongodb密碼認證實例

    今天小編就為大家分享一篇python連接mongodb密碼認證實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python中SSH遠程登錄設備的實現(xiàn)方法

    python中SSH遠程登錄設備的實現(xiàn)方法

    本文主要介紹了python中SSH遠程登錄設備,python中支持SSH協(xié)議的模塊主要有Paramiko和netmiko兩種,本文主要介紹了netmiko模塊,具有一定的參考價值,感興趣的可以了解一下
    2022-04-04

最新評論