【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?

2022-03-01

简介

关于 的理论大家可以查看以下链接,这里就不详细讲理论了:

1.长 J、E、T 等。完全为 [C]。和 , 2015.

2.于, , 和 . “多尺度按。” arXiv arXiv:1511.07122 (2015).

3.如何理解空洞卷积( )?

其实可以一句话概括,不用的时候扩大感受野(层层会导致信息丢失)

为了阅读方便,我贴一些相关链接:

【】tf.nn.实现卷积?

【】tf.nn.反卷积是如何工作的?

习惯上先显示功能:

tf.nn.(value,,rate,,name=None)

1

去掉name参数指定操作的名称,方法相关的参数有四个:

值:

指需要卷积的输入图像,需要一个形状为[batch, , width, ]的4维形状。具体含义是[训练时batch中的图像数量、图像高度、图像宽度、图像通道数]

相当于CNN中的卷积核,需要形状为[, , , ]的4维形状。具体含义为【卷积核的高度,卷积核的宽度,图像通道数,卷积核的核数】,同理,这里的第三维是参数的第四维价值

率:

要求是int型的正数,在正常的卷积操作中应该是可用的(即卷积核的滑动步长),但是空洞卷积是没有参数的,所以要特别注意这一点。相反,它使用了新的速率参数,那么速率参数有什么用呢?定义为我们对输入图像进行卷积时的采样间隔,可以理解为卷积核中穿插了(率-1)个数为“0”,插入了很多原来的卷积核“”东东”,在做卷积的时候,相当于增加了原图的采样间隔。如何插入,后面可以更详细的看到。这时候我们可以很容易得出结论,当rate=1时,没有0插入,这个函数就变成了一个普通的卷积。

数量类型,只能是“SAME”、“VALID”之一,这个值决定了不同的边缘填充方式。

ok,结束了,此时没有参数,可能有朋友会问“”参数。其实这个函数已经默认=1,即滑动步长不能改变,固定为1。

返回一个结果。当填充方式为“VALID”时,返回[batch,-2*(-1),width-2*(-1),],填充方式为“SAME””,返回[batch, , width, ],这个结果是怎么出来的?别着急,我们通过一个程序图来演示空心卷积。

实验

首先创建一个2通道图像

img = tf.(值=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[ 1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.)

img = tf.(=[img,img],axis=3)

1

2

然后用一个3*3的卷积核做卷积

= tf.(value=1, shape=[3,3,2,5], dtype=tf.)

= tf.nn.(value=img, =, rate=1)

1

2

建立img sum后,就可以做卷积了

= tf.nn.(input=img, =, =[1,1,1,1], =’VALID’)

1

输出5,我们设置rate=1,此时空洞卷积可视为普通卷积,在SAME和VALID模式下输出如下:

ok,调整rate=2,继续运行程序

= tf.nn.(value=img, =, rate=2, =’SAME’)

1

查看输出结果

[[[[ 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.]]]]]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

这个结果是怎么来的?使用另一张图片

这里我们看到,当rate=2时,通过穿插“0”,卷积核从3*3扩大到5*5。看看“VALID”模式,会发生什么?

报告了直接错误。因为卷积核的大小已经超过了原图大小

好了,相信在座的各位对空心卷积都有一个基本的了解。然后,当填充方式为“VALID”时,返回[batch,-2*(-1),width-2*(-1),],这个结果,相信大家都能证明.

代码清单

作为 tf

img = tf.(值=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[ 1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.)

img = tf.(=[img,img],axis=3)

= tf.(value=1, shape=[3,3,2,5], dtype=tf.)

= tf.nn.(value=img, =, rate=1, =’SAME’)

= tf.nn.(value=img, =, rate=1, =’VALID’)

= tf.nn.(value=img, =, rate=2, =’SAME’)

#错误

# = tf.nn.(value=img, =, rate=2, =’VALID’)

使用 tf.() 作为 sess:

print ‘rate=1, SAME mode :’

打印(sess.run())

print ‘rate=1, VALID mode :’

打印(sess.run())

print ‘rate=2, SAME mode :’

打印(sess.run())

#错误

#print ‘rate=2, VALID 模式:’

#print(sess.run())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

实现卷积、反卷积和空洞卷积

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容