估算卷积层与反卷积层运算量

这篇blog是对之前写的一篇博客的补充:

计算卷积神经网络浮点数运算量

      网上有很多介绍如何计算卷积网络运算量的文章,基本都是介绍卷积还有全连接等一些常用的层是如何计算的,但很少有介绍反卷积层的运算量如何计算。因为我做分割比较多,一般分割的网络都会带有反卷积层,所以估算网络运算量的时候,都是需要算上反卷积的。写这篇文章的目的主要是为了告诉读者,卷积、反卷积、分组卷积和分组反卷积的运算量分别是如何计算出来的,虽然最终的计算公式都很简单,但是具体是如何估算的这里会介绍下。

本文相关代码,计算MXNet网络运算量的小工具:

Python版本

Scala版本

普通卷积层运算量计算:

      这个普通卷积层的运算量很多文章都已经讲过如何计算了,这里也重复讲下,为后面介绍反卷积的运算量做铺垫。卷积的运算一般的实现就是转化为矩阵乘法运算,首先来看一下卷积运算的简单的示意图:

          首先左上角定义了输入和输出的feature map的形状,然后假设卷积核大小是(K, K),所以权值的形状就是 Cout * Cin * K * K,然后一般来说实现卷积的前向是通过首先对输入的feature map应用im2col操作,从 Cin * Hin * Win 形状的矩阵,转换成形状是 Cin * K * K * Hout * Wout 的矩阵,然后与权值相乘,就得到右边的输出。所以卷积前向的运算量看第一行就可以算出来了:

    如果还有偏置的话,还要加上加偏置的运算量:

      当然卷积运算的时候除了乘法还有加法,而我这了只算了乘法的次数,而且我看下面这个仓库的代码在计算运算量的时候也是只算了乘法。

https://github.com/albanie/convnet-burden

        虽然计算运算量不会计算反向过程,但是卷积的反向和接下来要介绍和反卷积的前向是对应的,所以也简单说下,在反向过程中,求输入的梯度的时候把权值转置一下,然后与输出的梯度相乘就得到中间结果,然后再做一个col2im操作把中间结果回填到输入梯度矩阵的对应位置上。

普通反卷积:

      然后我们来看下普通反卷积的运算量的计算方法,首先看一下反卷积前向和后向运算过程的示意图:

      左上角也是定义了反卷积的输入与输出的feature map大小,然后这里反卷积的权值的形状与卷积有点不同,是 Cin * Cout * K * K,这是因为反卷积的前向和后向操作分别是对应卷积的后向和前向,也就是刚好反过来的。然后我们直接看反卷积的前向操作,和卷积的后向操作对应,权值做转置,然后与输入feature map做一个乘法,这里可以看成是一个1x1的卷积,输出通道数是 Cout * K * K,然后的到中间结果,然后再做一个col2im的操作回填到输出feature map对应的位置上。所以反卷积的运算量如下:

    如果还有偏置的话则是:

    所以如果有偏置存在的话,计算反卷积的运算量是需要知道输入与输出feature map大小的。

分组卷积:

    分组卷积的运算量其实就是直接把卷积的运算量除以组数,比如分为g组,继续沿用上面卷积的运算量公式的话,那么分组卷积的运算量为:

      加上偏置的话就是:

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

      左上角定义了输入与输出feature map的大小还有卷积的分组数,则根据分组卷积的定义,输出feature map的通道Cout被分成了g组,每组里面的Cout / g个feature map链接输入的对应索引的 Cin / g 个通道的feature map,所以看上图,在把输入作im2col操作的时候也是按组来做的,每组都会生成一个 (Cin / g * K * K) * Hout * Wout的矩阵,然后与对应的权值做乘法,就是图中的相同颜色部分,然后每组做完乘法就得到了输出feature map,然后如果还有偏置,则是最后再加上,所以分组卷积的运算量就可以求到的了。

分组反卷积:

      然后来看下反卷积,有了分组卷积的铺垫,分组反卷积也不难求,分组反卷积的FP同样也是对应分组卷积的BP:

    同样的,左上角定义了分组反卷积的输入和输出feature map大小,分组数为g。同样的输出feature map的通道Cout被分成了g组,每组里面的Cout / g个feature map链接输入的对应索引的 Cin / g 个通道的feature map,然后在前向过程中,对于每组的计算,权值首先需要转置一下,得到 Cout / g * K * K * Cin / g的权值矩阵然后和输入对应的组数做乘法,然后得到输出对应的组的中间结果,然后每一组的中间结果再通过col2im回填到输出feature map对应的组的位置。

      所以分组反卷积的运算量如下:

      如果有偏置的话就是:

      如果想更加详细的了解代码上的实现,读者可以参考MXNet中反卷积权值shape的推断部分,还有反卷积前向部分代码

相关资料:

CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的?​


本文首发于:https://zhuanlan.zhihu.com/p/65248401

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容