1、普通卷积
如上图所示
输入:H*W*c1,
卷积核:c1*k*k*c2(卷积核维度为c1*k*k,共有c2个)
输出:H'*W'*c2
参数量:c1*k*k*c2 (不考虑bias)
运算量:c1*k*k*c2*H'*W'
2、分组卷积(假设group=2)
输入:H*W*c1
卷积核:c1*k*k*c2(卷积核维度为c1*k*k,共有c2/2个)
输出:H'*W'*c2
参数量:c1*k*k*c2/2 (不考虑bias)
运算量:c1/2*k*k*c2/2*H'*W'+c1/2*k*k*c2/2*H'*W'=(c1*k*k*c2*H'*W')/2, 也就是普通卷积的1/2
3、深度可分离卷积(Depthwise卷积+Pointwise卷积)
输入:H*W*c1
卷积核:c1*k*k(group=c1,每一组1个),c1*1*1*c2
输出:H'*W'*c2
参数量:c1*k*k+c1*1*1*c2(不考虑bias)
运算量:c1*k*k*H'*W'+c1*1*1*c2*H'*W'
4. 卷积和池化的输出特征图的大小计算公式一样,如下:
5. 感受野(Receptive Field):卷积神经网络每一层输出的特征图上的一个像素点在原始图像上映射的区域的大小 ,计算公式如下(N_RF为当前层感受野,(N-1)_RF为前一层感受野):
(N-1)_RF = f(N_RF, stride, kernel) = (N_RF - 1) * stride + kernel
例如:kernel:3*3, stride:2,则卷积后的特征对于输入的感受野为:(1-1)* 2 + 3 = 3
下图为另一个直观的例子:
6. 深度可分离卷积(depthwise convolution):
例如:input: w*h*c=3*3*3→用三个卷积核:x*x*1,分别于三个通道进行卷积(depthwise conv)→得到3个feature map→用M个1*1*3卷积正常卷积得到M个feature map(pointwise conv)。
7. 卷积与深度可分离卷积的计算量和参数量:
(1)卷积:
- 计算量:I(卷积核大小H) * J(卷积核大小W) * M(输入通道) * N(输出通道) * K(输出特征大小H) * L(输出特征大小W)
- 参数量:I(卷积核大小H) * J(卷积核大小W) * M(输入通道) * N(输出通道)
(2)深度可分离卷积:
- 计算量:I(卷积核大小H) * J(卷积核大小W) * M(输入通道)* K(输出特征大小H) * L(输出特征大小W)+ 1 * 1 * M(输入通道) * N(输出通道) * K(输出特征大小H) * L(输出特征大小W)
- 参数量:I(卷积核大小H) * J(卷积核大小W) * M(输入通道) + 1 * 1 * M(输入通道) * N(输出通道)
7.1 卷积计算量
通常只看乘法计算量:
7.2 标准卷积方式
C代表通道数,Ci输入通道数,C0为输出通道数。H*W为长宽
如下图;当前特征图Ci * H * W ,把特征图复制C0个,分别与3*3*Ci的卷积核进行卷积,输出特征图大小C0 * H * W,
用C0个3*3*Ci的卷积核进行卷积操作,所以参数量为3*3*Ci*C0,在H*W的特征图上操作,故计算量为3*3*Ci*C0*H*W .
可以记作 输入输出的pipeline Ci*3*3*H*W*Co
7.3 深度可分离卷积
逐通道卷积depthwise conv,再通道融合卷积pointwise
通道之间相互独立,故卷积核参数量为3*3*Ci (记忆技巧,输出通道数即为卷积核个数,卷积核个数乘以每个卷积核的参数即总参数) , 远少于标准卷积的 3*3*Ci*C0, 计算量为3*3*Ci*H*W。
逐通道卷积之后,再用1*1的卷积核进行通道间的特征融合
此时输入的特征图大小为H*W*Ci ,输出为H*W*C0
故后半部分卷积核参数量为1*1*C0*Ci, 计算量为1*1*C0*H*W*Ci, 可以记作从左到右pipeline Ci*1*1*H*W*C0
故深度可分离卷积的计算量为:3*3*Ci*H*W + 1*1*C0*H*W*Ci
是标准卷积的1/9,计算量大大减小。