神经网络运算量的计算

简介

那么对于给定一个卷积神经网络的模型定义,该如何估算其浮点数运算量。对卷积神经网络来说,卷积层的运算量是占网络总运算量的大头,而对于一些像素级别任务,反卷积层也要算上。

普通卷积

卷积的运算一般的实现就是转化为矩阵乘法运算,首先来看一下卷积运算的简单的示意图:
在这里插入图片描述首先左上角定义了输入和输出的feature map的形状,假设卷积核大小是 ( K , K ) (K, K) (K,K),所以权值的形状就是 C o u t ∗ C i n ∗ K ∗ K C_{out}*C_{in}*K*K CoutCinKK,然后一般来说实现卷积的前向是通过首先对输入的feature map应用im2col操作,从 C i n ∗ H i n ∗ W i n C_{in}*H_{in}*W_{in} CinHinWin形状的矩阵,转换成形状是 C i n ∗ K ∗ K ∗ H o u t ∗ W o u t C_{in}*K*K*H_{out}*W_{out} CinKKHoutWout的矩阵,接着与权值相乘,就得到右边的输出。所以卷积前向的运算量是:
C o u t ∗ C i n ∗ K ∗ K ∗ H o u t ∗ W o u t C_{out}*C_{in}*K*K*H_{out}*W_{out} CoutCinKKHoutWout
当然卷积运算的时候除了乘法还有加法( H o u t ∗ W o u t H_{out}*W_{out} HoutWout),而我这了只算了乘法的次数。
如果加上加偏置的计算,运算量就是:
C o u t ∗ ( C i n ∗ K ∗ K + 1 ) ∗ H o u t ∗ W o u t C_{out}*(C_{in}*K*K+1)*H_{out}*W_{out} Cout(CinKK+1)HoutWout

卷积的反向和接下来要介绍和反卷积的前向是对应的,这里简单提一下卷积的反向过程,求输入的梯度的时候是把权值转置,然后与输出的梯度相乘就得到中间结果,然后再做一个col2im操作把中间结果回填到输入梯度矩阵的对应位置上。

普通反卷积

接着我们来看下普通反卷积的运算量的计算方法,首先看一下反卷积前向和后向运算过程的示意图:
在这里插入图片描述左上角也是定义了反卷积的输入与输出的feature map大小,这里反卷积的权值的形状与卷积有点不同,是 C o u t ∗ C i n ∗ K ∗ K C_{out}*C_{in}*K*K CoutCinKK,这是因为反卷积的前向和后向操作分别是对应卷积的后向和前向,也就是刚好反过来的。

然后我们直接看反卷积的前向操作,和卷积的后向操作对应,权值做转置与输入feature map做一个乘法,这里可以看成是一个的卷积 1 ∗ 1 1*1 11,输出通道数是 C o u t ∗ K ∗ K C_{out}*K*K CoutKK ,然后得到中间结果,然后再做一个col2im的操作回填到输出feature map对应的位置上。所以反卷积的运算量如下:
C o u t ∗ K ∗ K ∗ C i n ∗ H i n ∗ W i n C_{out}*K*K*C_{in}*H_{in}*W_{in} CoutKKCinHinWin

同样1*1部分也是只考虑了乘法次数,还有后面的col2im回填累加其实也会占据运行时间的,但是这里没有加上这个加法次数的时间。加上偏置的话则是:
C o u t ∗ K ∗ K ∗ C i n ∗ H i n ∗ W i n + C o u t ∗ H o u t ∗ W o u t C_{out}*K*K*C_{in}*H_{in}*W_{in}+C_{out}*H_{out}*W_{out} CoutKKCinHinWin+CoutHoutWout

在这里插入图片描述

分组卷积

分组卷积的运算量其实就是直接把卷积的运算量除以组数,比如分为g组,继续沿用上面卷积的运算量公式的话,那么分组卷积的运算量为:
C o u t ∗ C i n / g ∗ K ∗ K ∗ H o u t ∗ W o u t C_{out}*C_{in} / g*K*K*H_{out}*W_{out} CoutCin/gKKHoutWout
加上偏置的话就是:
C o u t ∗ ( C i n / g ∗ K ∗ K + 1 ) ∗ H o u t ∗ W o u t C_{out}*(C_{in}/g*K*K+1)*H_{out}*W_{out} Cout(Cin/gKK+1)HoutWout

具体是怎么算出来的呢,直接看下面的示意图就应该很清晰了:

在这里插入图片描述

分组反卷积

来看下反卷积,有了分组卷积的铺垫,分组反卷积也不难求,分组反卷积的FP同样也是对应分组卷积的BP:
在这里插入图片描述对于每组的计算,权值首先需要转置一下,得到 C o u t / g ∗ K ∗ K ∗ C i n / g C_{out}/g*K*K*C_{in}/g Cout/gKKCin/g的权值矩阵然后和输入对应的组数做乘法,然后得到输出对应的组的中间结果,然后每一组的中间结果再通过 col2im 回填到输出 feature map 对应的组的位置。

所以分组反卷积的运算量如下:
C o u t / g ∗ K ∗ K ∗ C i n ∗ H i n ∗ W i n C_{out}/g*K*K*C_{in}*H_{in}*W_{in} Cout/gKKCinHinWin

如果有偏置的话就是:
C o u t / g ∗ K ∗ K ∗ C i n ∗ H i n ∗ W i n + C o u t ∗ H o u t ∗ W o u t C_{out}/g*K*K*C_{in}*H_{in}*W_{in}+C_{out}*H_{out}*W_{out} Cout/gKKCinHinWin+CoutHoutWout

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值