卷积神经网络CNN被LeCUN提出以后,出现了许多改进的卷积计算,在空间上有空洞卷积(dilated convolution),在通道上有分组卷积(group convolution)、深度可分离卷积(depth-wise separable convolution)。下面总结一下,不同的卷积运算,如何计算特征图大小、感受野尺度、参数量、运算量。
卷积操作介绍
正常的卷积操作:
对于图像矩阵来说,卷积操作就是一个固定大小(比如3*3)的滑动窗口,在图像上滑过,每次滑过的地方做逐像素的点乘操作。
如下图所示:
卷积操作有四个参数,分别是卷积核的大小F*F,卷积核的个数K, 卷积核滑动时的跳步(stride)S,以及对原图/特征图边缘进行0填充的个数P。
其中,F,S,P决定了卷积运算之后特征图的大小,K决定了输出特征图的维度。
对于padding的方式来说,tensorflow有“valid”和“same”两种,valid就是不填充,把卷积不到的地方去掉,same是把卷积不到的地方填充0,使得能够完成最后一次卷积,比如5*5卷积,最后只剩下四行,那么特征图会补充最后全为0的一行,以达到正常的卷积计算。声明一点,当stride=1时,使用same的padding方式得到的特征图大小将会跟原图大小一致。
空洞卷积:
空洞卷积如上图所示,就是在卷积的时候,间隔地去做计算。里面有个参数是空洞率dilation,dilation表示两个相邻计算元素的距离,比如dilation=3表示空两个单元。
据说空洞率思想来自于小波分解(wavelet decomposition),用于图像分割和生成等需要做稠密像素预测的任务上,主要是为了解决因池化计算带来的尺度降低。空洞卷积最大的优点就是能够在不降低特征图尺度的前提下提高感受野。知乎上也有对空洞卷积最为细致的探讨:https://www.zhihu.com/question/54149221。
分组卷积与深度可分离卷积:
上图左边是正常卷积,输出的每一个特征图都由输入特征图运算得到。右边是分组卷积,输出输出的特征图只由自己的组内的输入特征图得到。当把分组的组数设为输入通道数,分组卷积变成深度可分离卷积。分组卷积主要是为了减少参数量和计算量。这里有更详细介绍。
特征图计算
正常卷积的特征图计算公式:
其中O是输出的特征图大小,I是输入的特征图大小,P是填充的数量,F是卷积核大小,S是步长。
空洞卷积的特征图计算公式:
这里可以把空洞卷积核的大小看成是F+(F-1)(dilation-1),这样就比较好记。
感受野计算
正常卷积感受野计算公式:
一个详细的计算例子。
空洞卷积感受野计算公式:
先计算空洞卷积的对应卷积核大小:
再把
代入上式计算,值得一提的是感受野的计算不考虑padding。
参数量计算
正常卷积参数量计算:
卷积层:卷积核个数确定输出的channel,输入的channel决定的每个卷积核的厚度。
池化层:不需要可学习的参数。
全连接层:其实跟卷积层计算差不多,卷积层可以看成是参数共享的全连接网络。
分组卷积参数量计算:
参考这篇知乎文章:https://zhuanlan.zhihu.com/p/65377955,结论是分组卷积参数量是正常卷积的1/g倍,g是分组数。深度可分离卷积参数量是标准卷积的
。其中N是输入特征图通道数即分组数,
是卷积核大小。分别是深度分离卷积+1*1卷积带来的结果。
运算量计算
假设输入特征图:
输出特征图:
卷积核大小:
则标准卷积计算量:
深度可分离卷积计算量:
参考链接
1、Convolutional Neural Networks cheatsheet
2、CS231n Convolutional neural network for visual recognition
3、The Most Intuitive and Easiest Guide for Convolutional Neural Network
4、A Comprehensive Introduction to Different Types of Convolutions in Deep Learning
5、理解分组卷积和深度可分离卷积如何降低参数量
6、深度可分离卷积计算量与参数量