如何将神经网络模型的参数量和计算量降至级别?

摘要:其实模型的参数量好算,但浮点运算数并不好确定,我们一般也就根据参数量直接估计计算量了。但是像卷积之类的运算,它的参数量比较小,但是运算量非常大,它是一种计算密集型的操作。反观全连接结构,它的参数量非常多,但运算量并没有显得那么大。 FLOP
其实模型的参数量好算,但浮点运算数并不好确定,我们一般也就根据参数量直接估计计算量了。但是像卷积之类的运算,它的参数量比较小,但是运算量非常大,它是一种计算密集型的操作。反观全连接结构,它的参数量非常多,但运算量并没有显得那么大。 FLOPs(Floating-point Operations):浮点运算次数,理解为计算量,可以用来衡量算法的复杂度。一个乘法或一个加法都是一个FLOPs FLOPS(Floating-point Operations Per Second):每秒浮点运算次数,理解为计算速度,是一个衡量硬件性能的指标。 MACCs(multiply-accumulate operations):乘-加操作次数,MACCs 大约是 FLOPs 的一半。将$w*x+b$视为一个乘法累加,也称为1 个 MACC。 MAC(Memory Access Cost):内存访问成本 Params:是指模型训练中需要训练的参数总数 注意了:下面的阐述如果没有特别说明,默认都是batch为1。 全连接层   全连接权重$W$矩阵为$(C_{in}, C_{out})$,输入$(B, F, C_{in})$,输出$(B, F, C_{out})$。 全连接层执行的计算为:$y=matmul(x,W)+b$ $$Params=C_{in}*C_{out}+C_{out}$$ $$FLOPs=F*C_{in}*C_{out}+C_{out}$$ $$MACCs=F*C_{in}*C_{out}$$ (目前全连接层已经逐渐被 Global Average Pooling 层取代了) 注意,全连接层的权重参数量(内存占用)远远大于卷积层。 一维卷积层   一维卷积 kernel大小为$K$,输入通道$C_{in}$,输出通道$C_{out}$。输入$(B, C_{in}, F_{in})$,输出$(B, C_{out}, F_{out})$。 $$Params=K*C_{in}*C_{out}+C_{out}\quad(考虑bias)$$ 输出特征图有$(F_{out}, C_{out})$个像素 每个像素对应一个立体卷积核$k∗C_{in}$在输入特征图上做立体卷积卷积出来的; $$FLOPs=C_{in}*K*F_{out}*C_{out}+C_{out}\quad(考虑bias)$$ 二维卷积层   卷积层卷积核(Kernel)的高和宽:$K[0]$和$K[1]$ 。输入为$(N,C_{in},H_{in},W_{in})$。输出为 $(N,C_{out},H_{out},W_{out})$,其中$H_{\text{out}}$和$W_{\text{out}}$分别为特征图的高度和宽度。
阅读全文