tf.nn.atrous_conv2d如何实现空洞卷积与深度可分离卷积?

1.实现空洞卷积的函数

tf.nn.atrous_conv2d(value,filters,rate,padding,name=None)

除去name参数用以指定该操作的name,与方法有关的一共四个参数:

  • value: 

指需要做卷积的输入图像,要求是一个4维Tensor,具有[batch, height, width, channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]

  • filters: 

相当于CNN中的卷积核,要求是一个4维Tensor,具有[filter_height, filter_width, channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],同理这里第三维channels,就是参数value的第四维

  • rate: 

要求是一个int型的正数,正常的卷积操作应该会有stride(即卷积核的滑动步长),但是空洞卷积是没有stride参数的,这一点尤其要注意。取而代之,它使用了新的rate参数,那么rate参数有什么用呢?它定义为我们在输入图像上卷积时的采样间隔,你可以理解为卷积核当中穿插了(rate-1)数量的“0”,把原来的卷积核插出了很多“洞”,这样做卷积时就相当于对原图像的采样间隔变大了此时我们很容易得出rate=1时,就没有0插入,此时这个函数就变成了普通卷积。函数默认stride=1,也就是滑动步长无法改变,固定为1。

  • padding: 

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

结果返回一个Tensor,填充方式为“VALID”时,返回[batch,height-2*(filter_width-1),width-2*(filter_height-1),out_channels]的Tensor,填充方式为“SAME”时,返回[batch, height, width, out_channels]的Tensor。

2.实现深度可分离卷积的函数

tf.nn.depthwise_conv2d(value,filter,strides,padding,rate=None,name=None,data_format=None)
  • value: 

指需要做卷积的输入图像,要求是一个4维Tensor,具有[batch, height, width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]

  •  filter: 

相当于CNN中的卷积核,要求是一个4维Tensor,具有[filter_height, filter_width, in_channels, channel_multiplier]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,输入通道数,输出卷积乘子],同理这里第三维in_channels,就是参数value的第四维

  • strides: 

卷积的滑动步长

  • padding:

 string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同边缘填充方式

  •  rate:

 这里的rate和空洞卷积中的rate作用相同

给定4D输入张量('NHWC'或'NCHW'数据格式)和形状为[filter_height,filter_width,in_channels,channel_multiplier]的卷积核(卷积核包含in_channels个深度为1的卷积核),depthwise_conv2d对每个输入通道应用不同的卷积核(对于每个通道卷积后的结果,从1个通道扩展到channel_multiplier个通道,然后将结果连接在一起。输出具有in_channels * channel_multiplier通道
 

tf.nn.separable_conv2d(input,depthwise_filter,pointwise_filter,strides,padding,rate=None,name=None,data_format=None)

可以看做,深度卷积tf.nn.depthwise_conv2d的扩展,除去name参数用以指定该操作的name,data_format指定数据格式,与方法有关的一共六个参数:

  •  input:

 指需要做卷积的输入图像,要求是一个4维Tensor,具有[batch, height, width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]

  • depthwise_filter:

用来做depthwise_conv2d的卷积核,也就是说这个函数对输入首先做了一个深度卷积。它的shape规定是[filter_height, filter_width, in_channels, channel_multiplier]

  •  pointwise_filter:

用来做pointwise卷积的卷积核,什么是pointwise卷积呢?我们可以把它和GoogLeNet最原始版本Inception结构中后面的1*1卷积核做channel降维来做对比,这里也是用1*1的卷积核,输入通道是depthwise_conv2d的输出通道也就是in_channels * channel_multiplier,输出通道数可以自己定义。depthwise_conv2d是对输入图像的每一个channel分别做卷积输出的,那么这个操作我们可以看做是将深度卷积得到的分离的各个channel的信息做一个融合。它的shape规定是[1, 1, channel_multiplier * in_channels, out_channels]

  •   strides: 

卷积的滑动步长。

  • padding:

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

  • rate:

这里的rate和空洞卷积中的rate作用相同

举例来说,假设输入通道数64,输出通道数64,传统的Conv2D方法的参数数量为3*3*64*64;而SeparableConv2D的参数数量为3*3*64+1*1*64*64。3*3*64:对输入的64个通道分别进行卷积 ,1*1*64*64对concat后的64个通道进行1*1卷积(pointwise Convolution)。

猜你喜欢

转载自blog.csdn.net/weixin_42702666/article/details/88303712