计算机系统应用教程网站

网站首页 > 技术文章 正文

如何理解深度可分离卷积Depthwise Separable Convolution

btikc 2024-10-24 09:37:18 技术文章 21 ℃ 0 评论

深度可分离卷积相比于传统的卷积,参数量大大减少,从而提升了计算数据,但对精度的影响却很小。

首先我们来看传统神卷积操作流程:

这是cs231n的卷积动图,可以看到每个filter都需要用和输入通道相同的深度,如果输入通道特别大,那么每个filter在通道上的计算都会特别巨大,它同时考虑区域和通道;

可分离卷积在这个地方做不一样的处理,它将对区域和通道的计算分离开,把卷积分为两个步骤:

第一步让每个filter只用一个通道去分别和输入通道做卷积,输出为filter数量的单通道,

第二步,再在这个输出上用1x1x输出通道数量的filter做卷积

现在计算下传统卷积和可分离卷积的参数量

假设一个3×3大小的filter,其输入通道为32,输出通道为64

传统卷积的参数:3×3×32×64=18432

可分离卷积:

先考虑区域,即每个通道对应一个3×3×1大小的filter, 然后考虑通道对应64个1×1×32大小的filter

参数:3×3×1×32 + 1×1×32×64=2336

参数减少87%,大大提升了计算速度。

在TensorFlow中已经封装好了接口,主要有两个接口

tf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,name=None,data_format=None)

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

depthwise_conv2d 接口只做上文中的第一步,如果要完整的输出还需要在其输出后再使用1x1的卷积操作

tf.nn.conv2d(input=out_pre, filter=next_out_filter, strides=[1,1,1,1], padding='VALID')

separable_conv2d接口把上面两步一起完成

此外keras.layers里也封装了这两个接口

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表