• 神经网络中的参数量和FLOPs的计算


    1. 引言

    在看论文时,经常会看到计算CNN的parameters、FLOPs等评价指标,用来评价神经网络在推理运算上的速度与性能。本文将要来一一介绍这些指标以及相应的计算公式。
    闲话少说,我们直接开始吧!

    2. 参数量

    2.1 原理

    Parameters为模型中所有需要学习的参数量,包括卷积层、全连接层等,同时也会反映出模型占用的內存大小,当参数量越大,所需的內存就越多。

    CNN中卷积层的参数由卷积核权重与bias组成,假设input feature map的维度为H_in× W_in× C_in、kernel size为K_h× K_w,总共有C_out个kernel、output feature map的维度为H_out× W_out× C_out。

    此时,卷积核的参数量是K_h× K_w× C_in× C_out,而bias的参数量是C_out,因此CNN的参数量如下图所示为两者的相加。
    在这里插入图片描述
    上述过程图示如下:
    请添加图片描述

    2.2 示例

    接下来我们来看个具体的例子吧,假设input feature map的维度为5× 5× 3、kernel数量为7个且kernel size为3× 3、output feature map的维度为3× 3× 7,这样一层的计算量为3× 3× 3× 7 + 7 = 196。

    上述过程图示如下:
    请添加图片描述

    2.3 实操

    Parameters可以使用pytorch library torchinfo来进行计算,示例代码如下:

    # 安裝 torchinfo
    $ pip install torchinfo
    # ================================
    from torchinfo import summary
    import torch
    import torch.nn as nn
    # 自定义模型
    class MyModel(nn.Module):
        def __init__(self, in_channels, out_channels):
            super(MyModel, self).__init__()
            self.layer = nn.Conv2d(in_channels, out_channels, (3, 3))
            
        def forward(self, x):
            x = self.layer(x)
            
    model = MyModel(3, 7)
    batch_size = 16
    summary(model, input_size=(batch_size, 3, 5, 5))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    输出如下:
    请添加图片描述

    3. FLOPs

    3.1 原理

    FLOPs全名为floating point operations(浮点数的运算数),指模型前向传播的计算量、计算速度,用于衡量模型的复杂度。模型在前向传播的过程,在卷积层、池化层、Batch Norm、active function、Upsample、Downsample等都会产生计算量,尤其是在卷积层上占比最高。这些计算量对于模型的部署有很大的影响。

    ❗ 值得注意的是FLOPs与FLOPS(floating point operations per second)不同,全大写的FLOPS是指每秒浮点数的运算次数,用于衡量硬件性能。

    FLOPs的计算分为卷积核权重与bias两部分(Wx+b),令input feature map的维度为H_in× W_in× C_in、kernel size为K_h× K_w,且总共有C_out个kernel、output feature map的维度为H_out× W_out× C_out

    3.2 示例

    首先我们计算kernel的计算量,在进行一次卷积运算时,会需要(K_h× K_w× C_in)次乘法+(K_h× K_w× C_in -1)次加法。
    举个例子,若input feature map的维度为5× 5× 1、kernel数量为1个且kernel size为3× 3、output feature map的维度为3× 3× 1。如下图所示,总共会有3× 3× 1 = 9个乘法、3× 3× 1 -1 = 8个加法。
    请添加图片描述
    接着是bias的计算量,bias只有加法的计算,在进行一次卷积运算时,若有bias则加1。因此考虑有bias后卷积层的计算量为(K_h× K_w× C_in)次乘法+(K_h× K_w× C_in -1 +1)次加法= 2× K_h× K_w× C_in

    因此输出feature map的总计算量就会是2× K_h× K_w× C_in× H_out× W_out× C_out。上述过程,使用公式表示如下:
    请添加图片描述
    有时论文会使用别的单位,以下为不同单位间的换算公式:
    请添加图片描述

    4. 总结

    最后,我们从原理到例子,由前入深地介绍了卷积神经网络中卷积层参数量和计算量的定义。

    您学废了嘛?

  • 相关阅读:
    神经网络bp算法应用,bp神经网络动量因子
    Java集成阿里云的实时语音识别遇到的一些问题
    概率论-古典概型
    # 聚类系列(一)——什么是聚类?
    vue中实现百度地图全国与省市地图切换
    JavaScript基础(详细总结)
    系统升级数量超微软预期,Win10/11盗版激活被封杀
    大学生端午节网页作业制作 学生端午节日网页设计模板 传统文化节日端午节静态网页成品代码下载 端午节日网页设计作品
    Sentinel入门
    vue引入jQuery
  • 原文地址:https://blog.csdn.net/sgzqc/article/details/127676552