前言

​ 本文记录了深度学习模型中卷积操作的感受野和特征图尺寸计算方式,以及如何分析网络的参数量和计算量,用来评价一个模型的规模大小与推理速度。


正文

一、感受野计算

​ 感受野就是卷积神经网络每一层输出的特征图feature map上的像素点在原始图像上映射的区域大小。对于只有一层卷积或池化的网络来说,感受野就是feature map上的一个像素点对应于输入图像上的映射区域的大小,可以发现,感受野大小就是卷积核的大小。

​ 为了计算每层的感受野,需要条件是上一层感受野大小$r$,输出特征上两个相邻特征点的距离$j$和特征点中心坐标$start$,某个特征点感受野的中心坐标就等于这个特征点的中心坐标。当采用的卷积核大小为$k$,padding大小为$p$,步长为$s$,输出特征图的感受野可以按照如下步骤计算:

​ \(​ j_{out} =j_{in} * s ​\)

输出特征图的特征点间隔$j_{out}$,等于上一层的间隔值$j_{in}$乘以卷积的步长$s$,所以间隔值将是按照步长呈指数级增长。

\[r_{out} =r_{in}+(k-1) * j_{in}\]

输出特征图的感受野大小$r_{out}$,等于上一层感受野大小加上$ (k-1)*j_{in}$ ,所以感受野是呈指数级增加。

\[start_{out} =start_{in}+\left(\frac{k-1}{2}-p\right) * j_{in}\]

输出特征图的感受野中心坐标即对应特征点的中心坐标$start_{out}$,等于第一层的中心坐标$start_{in}$加上$ \frac{(k-1)}{2}-p$,再乘以前一层的间隔距离以得到实际距离。

padding并不影响感受野,但影响感受野中心坐标,步长$s$影响下层感受野,卷积核尺寸$k$影响该层的感受野大小和中心坐标。

p1
via 感受野计算示意图

二、特征图尺寸计算

定义如下相关参数符号:

符号 含义
$K_{in}$ 输入特征图尺寸,设长宽一致
$K_{out}$ 输出特征图尺寸,设长宽一致
$f$ 卷积核尺寸,设长宽一致
$C_{in}$ 卷积核通道数,即输入特征通道数
$C_{out}$ 卷积核个数,即输出特征通道数
$s$ 卷积核的移动步长
$p$ 对输入特征的填充行数或列数

对于不同的神经网络有不同的尺寸计算方式:

注:$[.]$表示向下取整

p2
via Pytorch官方文档

底层分析

​ 前面说到反卷积的本质上是先间隔填充零,扩大输入特征尺寸后再做步长为1的一般卷积的过程,所以padding是对输入特征做间隔填充零的操作的过程,而这里一般卷积根据Tensorflow和Pytorch分为两种情况:

​ 1、Pytorch中,一般卷积指的是不补零的卷积,类似Tensorflow中的VALID模式

​ 所以output_padding是在做完卷积后在输出特征后面补零的行列数

​ 2、Tensorflow中,一般卷积也有两种模式SAMEVALID,对于VALID与Pytorch操作相同,做完卷积后在输出特征后面补零;对于SAME则卷积需要补零,做完卷积后在输出特征后面截断多余的行列数。

p3
via 反卷积过程示意图

三、复杂度分析

​ 终端设备上运行深度学习算法需要考虑内存和算力的需求,因此需要进行模型复杂度分析,涉及到模型计算量(时间/计算复杂度)和模型参数量(空间复杂度)分析。

1、参数量计算

定义如下相关参数符号:

符号 含义
$f$ 卷积核尺寸,设长宽一致
$C_{in}$ 卷积核通道数,即输入特征通道数
$C_{out}$ 卷积核个数,即输出特征通道数
$F_1$ 前一层全连接层神经元数量
$F_2$ 当前层全连接层神经元数量
$P_w$ 当前层的weights参数量
$P_b$ 当前层的biases参数量
$P$ 当前层总参数量

网络层的参数量包括权重weight和偏差bias两种

可分离卷积由逐通道卷积Depthwise Conv和逐点卷积Pointwise Conv组成,Depthwise Conv是分组卷积的特例,即分组数与输入特征通道数相同,每组卷积核数为1。分组卷积的结构详见文章

Depthwise Conv作用:减小参数量与计算量

Pointwise Conv作用:改变输出通道数;融合通道特征

可分离卷积过程就是用$C_{in}$组$fxfx1$尺寸的卷积核对输入特征做分组卷积,再用$1x1xC_{out}$尺寸的卷积核做步长为1的卷积。因此参数量为:

\[\begin{align} &P_{w}=f^2*1*C_{in}+1*1*C_{in}*C_{out} \\ &P_{b}=C_{in}+C_{out} \\ &P=P_w+P_b \end{align}\]

全连接层参数量是前一层与当前层的神经元的大小乘积,神经元的大小由输入输出特征的长度决定(如果全连接层跟卷积相连,则需要将卷积输出特征展开为向量形式,向量长度由特征的尺寸决定):

\[\begin{align} &P_w=F_1*F_2 \\ &P_b=F_2 \\ &P=P_w+P_b \end{align}\]

2、计算量分析

一些专业名称:

FLOPsfloating point operations,浮点运算次数,即计算量,可以用来衡量算法模型时间复杂度。

FLOPSFloating-point Operations Per Second,每秒所执行的浮点运算次数,即硬件的计算速度,是一个衡量硬件性能的指标。

MACCsmultiply-accumulate operations,乘-加操作次数,是将一次乘法与一次加法和为一个操作。

沿用上面的符号定义

四、模型推理速度分析

​ 相同FLOPs的两个模型其运行速度是会相差很多的:

  1. 计算平台不同

    硬件对算法模型的影响。

  2. MAC(Memory Access Cost)

    相同FLOPs的算法对内存的访问情况不同,对速度也是有影响的。

  3. 并行度

    相同FLOPs的网络结构可能存在不一样的运行方式,有的是串行网络,有的是多路并行。


最后

参考文章:

如何计算CNN感受野

感觉野大小计算

感受野计算

CNN网络层的参数量与特征尺寸计算

当padding为“SAME” 和 “VALID”卷积层输出尺寸的大小的计算

深度卷积网络中如何进行上采样

分组卷积

CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的? - DengBoCong的回答

CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的? - AI生成创作的回答

神经网络的性能分析


声明

本文仅作为个人学习记录。