深度可分离卷积相比于传统的卷积,参数量大大减少,从而提升了计算数据,但对精度的影响却很小。
首先我们来看传统神卷积操作流程:

这是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里也封装了这两个接口
博客介绍了深度可分离卷积,它相比传统卷积能大幅减少参数量、提升计算速度且对精度影响小。阐述了传统卷积和可分离卷积的操作流程,通过假设示例计算出可分离卷积参数减少87%。还提及TensorFlow和Keras中封装的相关接口。
946

被折叠的 条评论
为什么被折叠?



