Tensorflow tf.nn.atrous_conv2d如何實現(xiàn)空洞卷積的
實驗環(huán)境:tensorflow版本1.2.0,python2.7
介紹
關(guān)于空洞卷積的理論可以查看以下鏈接,這里我們不詳細講理論:
3.如何理解空洞卷積(dilated convolution)?
其實用一句話概括就是,在不用pooling的情況下擴大感受野(pooling層會導(dǎo)致信息損失)
為了閱讀方便再貼一些相關(guān)鏈接:
【TensorFlow】tf.nn.conv2d是怎樣實現(xiàn)卷積的?
【TensorFlow】tf.nn.conv2d_transpose是怎樣實現(xiàn)反卷積的?
慣例先展示函數(shù):
tf.nn.atrous_conv2d(value,filters,rate,padding,name=None)
除去name參數(shù)用以指定該操作的name,與方法有關(guān)的一共四個參數(shù):
value:
指需要做卷積的輸入圖像,要求是一個4維Tensor,具有[batch, height, width, channels]
這樣的shape,具體含義是[訓練時一個batch的圖片數(shù)量, 圖片高度, 圖片寬度, 圖像通道數(shù)]
filters:
相當于CNN中的卷積核,要求是一個4維Tensor,具有[filter_height, filter_width, channels, out_channels]
這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,圖像通道數(shù),卷積核個數(shù)],同理這里第三維channels,就是參數(shù)value
的第四維
rate:
要求是一個int
型的正數(shù),正常的卷積操作應(yīng)該會有stride
(即卷積核的滑動步長),但是空洞卷積是沒有stride
參數(shù)的,這一點尤其要注意。取而代之,它使用了新的rate
參數(shù),那么rate參數(shù)有什么用呢?它定義為我們在輸入圖像上卷積時的采樣間隔,你可以理解為卷積核當中穿插了(rate-1)數(shù)量的“0”,把原來的卷積核插出了很多“洞洞”,這樣做卷積時就相當于對原圖像的采樣間隔變大了。具體怎么插得,可以看后面更加詳細的描述。此時我們很容易得出rate=1時,就沒有0插入,此時這個函數(shù)就變成了普通卷積。
padding:
string類型的量,只能是”SAME”,”VALID”其中之一,這個值決定了不同邊緣填充方式。
ok,完了,到這就沒有參數(shù)了,或許有的小伙伴會問那“stride”參數(shù)呢。其實這個函數(shù)已經(jīng)默認了stride=1,也就是滑動步長無法改變,固定為1。
結(jié)果返回一個Tensor,填充方式為“VALID”時,返回[batch,height-2*(filter_width-1),width-2*(filter_height-1),out_channels]
的Tensor,填充方式為“SAME”時,返回[batch, height, width, out_channels]
的Tensor,這個結(jié)果怎么得出來的?先不急,我們通過一段程序形象的演示一下空洞卷積。
實驗
首先創(chuàng)建一張2通道圖
img = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32) img = tf.concat(values=[img,img],axis=3)
然后用一個3*3卷積核去做卷積
filter = tf.constant(value=1, shape=[3,3,2,5], dtype=tf.float32) out_img = tf.nn.atrous_conv2d(value=img, filters=filter, rate=1)
建立好了img和filter,就可以做卷積了
out_img = tf.nn.conv2d(input=img, filter=filter, strides=[1,1,1,1], padding='VALID')
輸出5個channel,我們設(shè)置rate=1,此時空洞卷積可以看做普通的卷積,分別在SAME和VALID模式下輸出如下:
ok,調(diào)整rate=2,繼續(xù)運行程序
out_img = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='SAME')
查看輸出結(jié)果
[[[[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]
[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]][[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]
[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]][[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]
[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]][[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]
[ 16. 16. 16. 16. 16.]
[ 24. 24. 24. 24. 24.]]]]
這個結(jié)果怎么出來的呢?再用一張圖
這里我們看到rate=2時,通過穿插“0”,卷積核由3*3膨脹到了5*5。再看看“VALID”模式下,會發(fā)生什么?
直接報錯了。因為卷積核的大小已經(jīng)超過了原圖大小
好了,看到這里相信大家對于空洞卷積有了基本的了解了。那么,填充方式為“VALID”時,返回[batch,height-2*(filter_width-1),width-2*(filter_height-1),out_channels]
的Tensor,這個結(jié)果,相信大家就可以證明了。
代碼清單
import tensorflow as tf img = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32) img = tf.concat(values=[img,img],axis=3) filter = tf.constant(value=1, shape=[3,3,2,5], dtype=tf.float32) out_img1 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='SAME') out_img2 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='VALID') out_img3 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='SAME') #error #out_img4 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='VALID') with tf.Session() as sess: print 'rate=1, SAME mode result:' print(sess.run(out_img1)) print 'rate=1, VALID mode result:' print(sess.run(out_img2)) print 'rate=2, SAME mode result:' print(sess.run(out_img3)) # error #print 'rate=2, VALID mode result:' #print(sess.run(out_img4))
到此這篇關(guān)于Tensorflow tf.nn.atrous_conv2d如何實現(xiàn)空洞卷積的的文章就介紹到這了,更多相關(guān)Tensorflow tf.nn.atrous_conv2d空洞卷積內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
這篇文章主要介紹了PyQt5.6+pycharm配置以及pyinstaller生成exe,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06Python數(shù)據(jù)分析之?Pandas?Dataframe條件篩選遍歷詳情
這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe條件篩選遍歷詳情,查詢Pandas?Dataframe數(shù)據(jù)時,經(jīng)常會篩選出符合條件的數(shù)據(jù),關(guān)于其使用方式,需要的小伙伴可以參考一下下面文章內(nèi)容2022-05-05python實現(xiàn)將文本轉(zhuǎn)換成語音的方法
這篇文章主要介紹了python實現(xiàn)將文本轉(zhuǎn)換成語音的方法,涉及Python中pyTTS模塊的相關(guān)使用技巧,需要的朋友可以參考下2015-05-05Python?Matplotlib繪制扇形圖標簽重疊問題解決過程
在使用Matplotlib畫圖時,常會遇到標簽重疊問題的時候,所以下面這篇文章主要給大家介紹了關(guān)于Python?Matplotlib繪制扇形圖標簽重疊問題的解決過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08python入門語句基礎(chǔ)之if語句、while語句
本文介紹了python入門語句基礎(chǔ)之if語句、while語句,if?語句讓你能夠檢查程序的當前狀態(tài),并據(jù)此采取相應(yīng)的措施,而for?循環(huán)用于針對集合中的每個元素都一個代碼塊,而?while?循環(huán)不斷地運行,直到指定的條件不滿足為止,本文通過示例代碼詳解介紹,需要的朋友參考下吧2022-04-04Python Opencv中用compareHist函數(shù)進行直方圖比較對比圖片
這篇文章主要介紹了Python Opencv中用compareHist函數(shù)進行直方圖比較進行對比圖片,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04