zoukankan      html  css  js  c++  java
  • 深度学习之(经典)卷积层计算量以及参数量总结 (考虑有无bias,乘加情况)

    目录:

    1、经典的卷积层是如何计算的

    2、分析卷积层的计算量

    3、分析卷积层的参数量

    4、pytorch实现自动计算卷积层的计算量和参数量


    1、卷积操作如下:

    http://cs231n.github.io/assets/conv-demo/index.html

    假设卷积层的输入特征图大小为C_in x H x W, 卷积核大小为K_1 x K_2, padding = P_1 x P_2, stride = S_1 x S_2, filter 数目为C_out。

    输出的特征图大小为C_out x H_out x W_out, 其中

      H_out = [(H - K_1 + 2P_1) / S_1] + 1

      W_out = [(W - K_2 + 2P_2) / S_2] + 1

    []表示向下取整。


    2、计算量分析

    只考虑乘法计算量:

    为了得到输出的特征图的某一个位置的像素值,需要 C_in x K_1 x K_2次乘法操作,而特征图总共有C_out x H_out x W_out个像素,因此总计算量为

                        C_out x H_out x W_out x ( C_in x K_1 x K_2)

    同时考虑乘法和加法计算量:

    1)bias=true,即考虑偏置的情况

    乘法操作计算量:

    为了得到输出的特征图的某一个位置的像素值,需要 C_in x K_1 x K_2 次乘法操作,而特征图总共有C_out x H_out x W_out个像素,因此总计算量为

                        C_out x H_out x W_out x ( C_in x K_1 x K_2)

    加法操作计算量:

    为了得到输出的特征图的某一个位置的像素值,需要 (C_in x (K_1 x K_2 - 1)) + (C_in - 1) + 1  = C_in x K_1 x K_2 次加法操作,可以看成三部分,第一部分表示在某一个通道进行一个K_1 x K_2 大小的卷积操作需要 (K_1 x K_2 - 1)次加法,有C_in个通道,故 C_in x (K_1 x K_2 - 1)次加法,每个通道都卷积后,得到C_in个数,接下来需要有 C_in - 1次加法,最后加上bias又1次加法。 而特征图总共有C_out x H_out x W_out个像素,因此总加法计算量为

                        C_out x H_out x W_out x ( C_in x K_1 x K_2)

    因此综上所述,乘加法计算量为 2 x  C_out x H_out x W_out x (C_in x K_1 x K_2)

    Note that:

    当前一般浮点操作数(flops),一般只看卷积乘法以及加上bias的一次加法。

    bias=true, flops = C_out x H_out x W_out x ( C_in x K_1 x K_2 + 1)

    bias=false, flops= C_out x H_out x W_out x ( C_in x K_1 x K_2)

    2)bias=false,不考虑偏置情况。根据上述分析,无bias情况下乘加法计算量为C_out x H_out x W_out x (2 x C_in x K_1 x K_2 - 1)


    3、参数量分析

    卷积核参数量:

    C_out x C_in x K_1 x K_2

    bias参数量:

    C_out

    因此总参数量为 C_out x C_in x K_1 x K_2 + C_out


    4、pytorch实现

  • 相关阅读:
    .editorconfig
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    《大道至简》读后感
    每日日报
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11302618.html
Copyright © 2011-2022 走看看