日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dilated/Atrous conv 空洞卷积/多孔卷积

發(fā)布時間:2024/4/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dilated/Atrous conv 空洞卷积/多孔卷积 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Dilated/Atrous conv 空洞卷積/多孔卷積

原文鏈接:https://blog.csdn.net/silence2015/article/details/79748729

DilatedDilated convolution/Atrousconvolution/Atrous convolutionconvolution可以叫空洞卷積或者擴(kuò)張卷積。

空洞卷積誕生于圖像分割領(lǐng)域,圖像輸入到網(wǎng)絡(luò)中經(jīng)過CNNCNN提取特征,再經(jīng)過poolingpooling降低圖像尺度的同時增大感受野。由于圖像分割是pixel?wisepixel?wise預(yù)測輸出,所以還需要通過upsamplingupsampling將變小的圖像恢復(fù)到原始大小。upsamplingupsampling通常是通過deconvdeconv(轉(zhuǎn)置卷積)完成。因此圖像分割FCNFCN有兩個關(guān)鍵步驟:池化操作增大感受野,upsamplingupsampling操作擴(kuò)大圖像尺寸。這兒有個問題,就是雖然圖像經(jīng)過upsamplingupsampling操作恢復(fù)了大小,但是很多細(xì)節(jié)還是被池化操作丟失了。那么有沒有辦法既增大了感受野又不減小圖像大小呢?DilatedDilated convconv橫空出世。

在講空洞卷積都會用到原論文中的一張圖來說明

在空洞卷積中有個重要的參數(shù)叫raterate,這個參數(shù)代表了空洞的大小。?
要理解空洞概念和如何操作可以從兩個角度去看。?
1)從原圖角度,所謂空洞就是在原圖上做采樣。采樣的頻率是根據(jù)rate參數(shù)來設(shè)置的,當(dāng)rate為1時候,就是原圖不丟失任何信息采樣,此時卷積操作就是標(biāo)準(zhǔn)的卷積操作,當(dāng)rate>1,比如2的時候,就是在原圖上每隔一(rate-1)個像素采樣,如圖b,可以把紅色的點想象成在原圖上的采樣點,然后將采樣后的圖像與kernel做卷積,這樣做其實變相增大了感受野。?
2)從kernel角度去看空洞的話就是擴(kuò)大kernel的尺寸,在kernel中,相鄰點之間插入rate-1個零,然后將擴(kuò)大的kernel和原圖做卷積 ,這樣還是增大了感受野。

在VGG網(wǎng)絡(luò)中就證明了使用小卷積核疊加來取代大卷積核可以起到減少參數(shù)同時達(dá)到大卷積核同樣大小感受野的功效。但是通過疊加小卷積核來擴(kuò)大感受野只能線性增長,公式為(kernelSize?1)?layers+1(kernelSize?1)?layers+1,,也就是線性增長,而空洞卷積可以以指數(shù)級增長感受野。

標(biāo)準(zhǔn)卷積方式?

空洞卷積方式?

空洞卷積在全卷積網(wǎng)絡(luò)(FCN)(FCN)中可以有效地控制計算特征圖響應(yīng)的密度,在密集預(yù)測的任務(wù)中,如語義分割/semanticsemantic imageimage segmentation,segmentation, opticaoptical flowflow computationcomputation, oror depthdepth estimationestimation,當(dāng)它和雙線性插值一起使用時可以替代轉(zhuǎn)置卷積。空洞卷積可以在kernel有效增大感受野的同時不增加模型參數(shù)或者計算量。在圖像需要全局信息或者語音文本需要較長的sequence信息依賴的問題中,都能較好的應(yīng)用空洞卷積。在圖像分割,語音合成WaveNet,機器翻譯ByteNet中都有空洞卷積的身影。

在之前的一篇博文中,我稍微總結(jié)了deconv/轉(zhuǎn)置卷積概念和用法,現(xiàn)在把deconv和Dilated conv在一起比較一下。

deconvdeconv主要用在增大圖像尺寸,是upsamplingupsampling的一種。而空洞卷積并沒有做upsampling,而是為了增大感受野,并且可以不改變圖像大小(stridestride為1)。

對于標(biāo)準(zhǔn)的k*k的卷積核,stridestride為ss,分三種情況分析:

1)s>1s>1,在卷積同時并伴隨了downsamplingdownsampling操作,卷積后圖像變小。?
2)s=1s=1,在paddingpadding為SAMESAME時卷積后圖像大小不變?
3)s<1s<1,fractionallyfractionally stridedstrided convolutionconvolution,相當(dāng)于對原圖先作了upsamplingupsampling操作擴(kuò)大原圖,然后再卷積,這樣得到的結(jié)果圖會變大。

DilatedDilated convconv是在原圖上skipskip一些像素然后做卷積,或者是將kernelkernel填充擴(kuò)大后來卷積,以達(dá)到增大感受野的效果。

在TensorflowTensorflow框架中可以通過兩種方式實現(xiàn)空洞卷積,tf.nn.atrous__conv2dtf.nn.atrous__conv2d或者tf.nn.conv2dtf.nn.conv2d。

tf.nn.atrous__conv2dtf.nn.atrous__conv2d有五個參數(shù),value,filters,rate,padding,namevalue,filters,rate,padding,name。其中raterate就是代表對kernelkernel做填充的程度,在kernelkernel每個值之間填充rate?1rate?1個零,這樣得到的有效卷積核高為filterHeight+(filterHeight?1)?(rate?1)寬為filterWidth+(filterWidth?1)?(rate?1)。filterHeight+(filterHeight?1)?(rate?1)寬為filterWidth+(filterWidth?1)?(rate?1)。
在tf.nn.conv2d函數(shù)中有一個參數(shù)叫dilations,同樣可以是可以實現(xiàn)空洞卷積的效果


2018/4/2更新:

在實際使用中發(fā)現(xiàn)atrous_conv2d和conv2d對于空洞后卷積輸出的shape描述不清楚,自己搜資料發(fā)現(xiàn)輸出的shape不光和padding有關(guān),還與rate有關(guān)。輸出shape計算思路如下,首先看padding,如果padding是SAME,那么不管rate是多少,都按照這個來算。如果padding是VALID,那么也是按照這個來算,只不過這兒的filter_size需要根據(jù)rate來重新算,也就是說空洞是加在卷積核上的,我們先對卷積核填充0,得到新的卷積核大小filter_height = heght+(height-1)*(rate-1),寬同理。將新的filter送到上面VALID模式下計算卷積輸出就是最后的輸出了。實際代碼輸出感受下

import tensorflow as tf import numpy as npinput_img_np = np.random.random((1, 256, 256, 1)).astype(np.float32) kernel = np.random.random((6,6,1,1)).astype(np.float32)with tf.Session() as sess:concrete_input_op = tf.constant(input_img_np)concrete_output_op = tf.nn.convolution(concrete_input_op, kernel, padding='SAME', dilation_rate=np.array([2, 2]))concrete_output = sess.run(concrete_output_op)print('convolution + CONCRETE + SAME')print('concrete_input_op: ', concrete_input_op.get_shape())print('concrete_output_op: ', concrete_output_op.get_shape())print('concrete_output:', concrete_output.shape)assert(concrete_input_op.get_shape() == concrete_output_op.get_shape())

convolution + CONCRETE + SAME
Backend TkAgg is interactive backend. Turning interactive mode on.
concrete_input_op: ?(1, 256, 256, 1)
concrete_output_op: ?(1, 256, 256, 1)
concrete_output: (1, 256, 256, 1)?

undef_input_op = tf.placeholder(tf.float32, shape=(None, 256, 256, 1))undef_output_op = tf.nn.convolution(undef_input_op, kernel, padding='SAME', dilation_rate=np.array([2, 2]))undef_output = sess.run(undef_output_op, feed_dict={undef_input_op: input_img_np})print('convolution + UNDEF + SAME')print('undef_input_op: ', undef_input_op.get_shape())print('undef_output_op: ', undef_output_op.get_shape())print('undef_output:', undef_output.shape)# This assert will correctly fail even though the shapes are ok because shapes are only partially known# assert(undef_input_op.get_shape() == undef_output_op.get_shape())

convolution + UNDEF + SAME
undef_input_op: ?(?, 256, 256, 1)
undef_output_op: ?(?, 256, 256, 1)
undef_output: (1, 256, 256, 1)

valid_concrete_input_op = tf.constant(input_img_np)valid_concrete_output_op = tf.nn.convolution(valid_concrete_input_op, kernel, padding='VALID', dilation_rate=np.array([2, 2]))valid_concrete_output = sess.run(valid_concrete_output_op)print('convolution + CONCRETE + VALID')print('valid_concrete_input_op: ', valid_concrete_input_op.get_shape())print('valid_concrete_output_op: ', valid_concrete_output_op.get_shape())#filter_h=6+(6-1)*(rate-1)=11,out_h=ceil(256-11+1)/1=246print('valid_concrete_output:', valid_concrete_output.shape)

convolution + CONCRETE + VALID
valid_concrete_input_op: ?(1, 256, 256, 1)
valid_concrete_output_op: ?(1, 246, 246, 1)
valid_concrete_output: (1, 246, 246, 1)

valid_undef_input_op = tf.placeholder(tf.float32, shape=(None, 256, 256, 1))valid_undef_output_op = tf.nn.convolution(valid_undef_input_op, kernel, padding='VALID', dilation_rate=np.array([2, 2]))valid_undef_output = sess.run(valid_undef_output_op, feed_dict={valid_undef_input_op: input_img_np})print('convolution + UNDEF + VALID')print('valid_undef_input_op: ', valid_undef_input_op.get_shape())print('valid_undef_output_op: ', valid_undef_output_op.get_shape())print('valid_undef_output:', valid_undef_output.shape)# This assert will correctly fail even though the shapes are ok because shapes are only partially known# assert(undef_input_op.get_shape() == undef_output_op.get_shape())

convolution + UNDEF + VALID
valid_undef_input_op: ?(?, 256, 256, 1)
valid_undef_output_op: ?(?, 246, 246, 1)
valid_undef_output: (1, 246, 246, 1)
?

?tf.nn.atrous_conv2d

# Now atrousconcrete_input_op = tf.constant(input_img_np)concrete_output_op = tf.nn.atrous_conv2d(concrete_input_op, kernel, padding='SAME', rate=2)concrete_output = sess.run(concrete_output_op)print('atrous_conv2d + CONCRETE + SAME')print('concrete_input_op: ', concrete_input_op.get_shape())print('concrete_output_op: ', concrete_output_op.get_shape())print('concrete_output_op: ', concrete_output_op.get_shape())print('concrete_output:', concrete_output.shape)assert(concrete_input_op.get_shape() == concrete_output_op.get_shape())

atrous_conv2d + CONCRETE + SAME
concrete_input_op: ?(1, 256, 256, 1)
concrete_output_op: ?(1, 256, 256, 1)
concrete_output_op: ?(1, 256, 256, 1)
concrete_output: (1, 256, 256, 1)

valid_concrete_input_op = tf.constant(input_img_np)valid_concrete_output_op = tf.nn.atrous_conv2d(valid_concrete_input_op, kernel, padding='VALID', rate=2)valid_concrete_output = sess.run(valid_concrete_output_op)print('atrous_conv2d + CONCRETE + VALID')print('valid_concrete_input_op: ', valid_concrete_input_op.get_shape())print('valid_concrete_output_op: ', valid_concrete_output_op.get_shape())print('valid_concrete_output:', valid_concrete_output.shape)

atrous_conv2d + CONCRETE + VALID
valid_concrete_input_op: ?(1, 256, 256, 1)
valid_concrete_output_op: ?(1, 246, 246, 1)
valid_concrete_output: (1, 246, 246, 1)


參考文獻(xiàn):

Tensorflow官方文檔?
知乎:如何理解空洞卷積(dilated convolution)??
https://github.com/tensorflow/tensorflow/issues/4742
?

總結(jié)

以上是生活随笔為你收集整理的Dilated/Atrous conv 空洞卷积/多孔卷积的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天堂资源站 | 成人免费看毛片 | 99性趣网 | 亚洲一区二区三区在线免费观看 | 国产欧美日韩二区 | a视频网站 | 芒果视频污污 | 美女又爽又黄免费 | 丰满多毛的大隂户视频 | 国产123区| 国产美女无遮挡免费 | 午夜在线观看视频网站 | 污视频在线播放 | 欧美日韩aa| 色呦呦一区二区 | av不卡网站| 游戏涩涩免费网站 | 亚洲免费一二三区 | 人人艹在线观看 | free欧美性69护士呻吟 | 久久发布国产伦子伦精品 | 在线色资源 | 性无码专区无码 | 国产一区二区自拍视频 | 手机在线播放av | 午夜激情视频在线 | 99久久久无码国产精品免费麻豆 | 开心激情网五月天 | 97香蕉超级碰碰久久免费软件 | www.四虎影视 | 国外亚洲成av人片在线观看 | 国产一级在线观看视频 | 亚洲一区福利视频 | 欧美一区二区日韩 | v888av| 性欧美1819性猛交 | 国产精品久久久久久无人区 | 中文字幕永久在线播放 | 国产精选中文字幕 | 亚洲经典视频 | 久久中文字幕视频 | 国产精品秘入口18禁麻豆免会员 | 亚洲天堂小说 | 亚洲精品视频中文字幕 | 日韩久久一区二区三区 | jizz欧美性20 | 九九九精品视频 | a√天堂在线 | 国产一级性生活片 | 国产无遮挡又黄又爽免费网站 | 国产成人一区二区三区影院在线 | 亚洲成人一区在线观看 | 日韩中文在线字幕 | 人妻无码一区二区三区久久 | 草在线视频 | 国产一级免费 | 国产性久久 | 97成人资源站 | 在线免费观看高清视频 | 黄污视频在线播放 | 水蜜桃亚洲精品 | 天天想你在线观看完整版电影免费 | 国产精品久久久久久亚洲 | 婷婷影院在线观看 | 欧美午夜精品久久久久久蜜 | 成人在线视频免费看 | 蜜桃视频一区二区三区在线观看 | 久久久天堂国产精品女人 | 国产乱国产乱300精品 | 美女色综合 | av先锋资源 | 国产熟女一区二区丰满 | 久久亚洲综合国产精品99麻豆精品福利 | 欧美成人精品 | 完全免费av | 中文字幕日韩精品在线 | 欧美福利第一页 | 国产高清一级片 | 日韩综合久久 | 视频在线观看免费大片 | 另类第一页 | 极品久久久久 | 超碰av男人的天堂 | 影音先锋丝袜制服 | 中文字幕日日夜夜 | 欧美日韩国产激情 | 一级全黄裸体免费观看视频 | 欧美成人黄色小说 | 免费无遮挡无码永久视频 | 金瓶狂野欧美性猛交xxxx | 91国在线视频 | www.色午夜 | 国产成人无码精品久久久久 | 手机看片1024久久 | 亚洲综合欧美综合 | 精品久久久中文字幕 | 西野翔夫の目の前で犯在线 | 男人的天堂免费视频 | 午夜小影院 |