卷积神经网络参数量和计算量的计算方法

本文总结了标准卷积分组卷积全连接层参数量和计算量的计算方法,如有错误,麻烦大家指正

一、标准卷积

假设输入特征的shape为[C_{in}, H_{in}, W_{in}],卷积核的shape为[C_{in}, C_{out}, k, k],输出特征的shape为[C_{out}, H_{out}, W_{out}],则,

标准卷积运算的参数量为:

  • 不考虑bias:params=k\times k\times C_{in}\times C_{out}
  • 考虑bias:params=(k\times k\times C_{in}\times +1)\times C_{out}

标准卷积运算的计算量为:

  • 不考虑bias:FLOPs=[(k\times k\times C_{in})+(k\times k\times C_{in}-1)]\times H_{out}\times W_{out}\times C_{out}
  • 考虑bias:FLOPs=[(k\times k\times C_{in})+(k\times k\times C_{in}-1)+1]\times H_{out}\times W_{out}\times C_{out}

二、分组卷积

假设输入特征的shape为[C_{in}, H_{in}, W_{in}],卷积核的shape为[gC_{in}, C_{out}, k, k](g为分组数量),输出特征的shape为[C_{out}, H_{out}, W_{out}],则,

分组卷积运算的参数量为:

  • 不考虑bias:params=k\times k\times \frac{C_{in}}{g}\times \frac{C_{out}}{g}\times g
  • 考虑bias:params=(k\times k\times \frac{C_{in}}{g}+1)\times \frac{C_{out}}{g}\times g

分组卷积运算的计算量为:

  • 不考虑bias:FLOPs=[(k\times k\times \frac{C_{in}}{g})+(k\times k\times \frac{C_{in}}{g}-1)]\times H_{out}\times W_{out}\times \frac{C_{out}}{g}\times g
  • 考虑bias:FLOPs=[(k\times k\times \frac{C_{in}}{g})+(k\times k\times \frac{C_{in}}{g}-1)+1]\times H_{out}\times W_{out}\times \frac{C_{out}}{g}\times g

举个栗子,假设输入特征的shape为[1,3,6,6],卷积的shape为[3,6,3,3],分组卷积的g为3,输出特征的shape为[1,6,2,2],则,标准卷积的计算量=[(3*3*3)+(3*3*3-1)+1]*2*2*6=1296,分组卷积的计算量=[(3*3*3)+(3*3*3-1)+1]*2*2*6/3*3=1296/3=432。下面使用thop验证一下,

import torch
import torch.nn as nn
from torchstat import stat
from thop import profile


x = torch.randn((1,3,6,6))
conv1 = nn.Conv2d(3,6,3,3)
conv2 = nn.Conv2d(3,6,3,3,groups=3)
flops1, params1 = profile(conv1, inputs=(x))
print(flops1)
print("自测:", (3*3*3+3*3*3-1+1)*6*2*2)
flops2, params2 = profile(conv2, inputs=(x))
print(flops2)
print("自测:", ((3*3*1+3*3*1-1+1)*6*2*2))


"""
[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.
1296.0
自测: 1296
[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.
432.0
自测: 432
"""

深入思考一下,经过标准卷积层后,输出特征图上的每一个点都由k\times k\times C_{in}计算得来。而如果经过的是分组卷积层,那么输出特征图上的每一个点则由k\times k\times \frac{C_{in}}{g}计算得来。因此,分组卷积的参数量为标准卷积参数量的\frac{1}{g}

然而,由于深度卷积的FLOPs与内存访问的比率太低,难以有效利用硬件,所以只是理论上比标准卷积的计算要快

三、全连接层

假设全连接层的shape为[C_{in}, C_{out}],则,

全连接层的参数量为:

  • 不考虑bias:params=C_{in}\times C_{out}
  • 考虑bias:params=(C_{in}+1)\times C_{out}

全连接层的计算量为:

  • 不考虑bias:FLOPs=[C_{in}+(C_{in}-1)]\times C_{out}
  • 考虑bias:FLOPs=[C_{in}+(C_{in}-1)+1]\times C_{out}
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen_znn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值