关闭

CNN——架构上的一些数字

1391人阅读 评论(0) 收藏 举报
分类:
作者:冯超
链接:https://zhuanlan.zhihu.com/p/22197188
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

前面说了很多关于CNN的数值上的事,下面我们来看看网络架构。网络架构也是CNN的一个核心部分,由于CNN的特点是它的深度,所以深度模型的网络架构给了人们无数的想象,于是也有了无数的前辈创造了各种各样的模型。我们今天来看看那些经典的模型,不是从感性的角度上去观看,而是从理性的角度——去尝试计算一些具体的数字,让我们描绘出这些模型的一个简单轮廓。

我们的目标问题是ImageNet分类问题,那么我们主要关注哪些问题呢?

  1. 模型的深度,模型的核心层(卷积层、全连接层)的数量,这代表了模型的某种“能力”,基本上大家都有一个共识,那忽略优化问题的情况下,就是越深的模型在函数拟合方面效果越好。这里直接利用Caffe计算其中的layers_.size(),由于其中还包括data layer和loss layer,所以统计数会比实际的层数要多。
  2. 每层模型的参数数量,参数的总量,这代表了模型的复杂度。从机器学习的理论上讲,参数越多,模型的表达能力理论上也会“越强”。这里通过Caffe计算所有learnable_params的count总和表示。
  3. 模型前向的所需的内存量。也就是Caffe中计算的memory_used_变量值。

AlexNet

本文不是负责介绍历史的,所以不会花什么篇幅去聊故事。模型的prototxt来自:github.com/BVLC/caffe/b


VGGNet

VGGNet也是一个比较有代表性的网络,关于这个网络的“哲学”我们后面再开新贴去聊。利用论文和各处得到的信息,我们可以详细给出VGG19层模型的具体结构,参考的prototxt来自:gist.github.com/ksimony

CS231n Convolutional Neural Networks for Visual Recognition对VGG模型的内存占用量和参数数量做过一个计算,仅作参考:

INPUT: [224x224x3]        memory:  224*224*3=150K   weights: 0
CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*3)*64 = 1,728
CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*64)*64 = 36,864
POOL2: [112x112x64]  memory:  112*112*64=800K   weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*128)*128 = 147,456
POOL2: [56x56x128]  memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2: [28x28x256]  memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2: [14x14x512]  memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2: [7x7x512]  memory:  7*7*512=25K  weights: 0
FC: [1x1x4096]  memory:  4096  weights: 7*7*512*4096 = 102,760,448
FC: [1x1x4096]  memory:  4096  weights: 4096*4096 = 16,777,216
FC: [1x1x1000]  memory:  1000 weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters

可见在计算过程中偏置项并没有被计算在其中。我们也要做一个详细的计算。

GoogleNet

GoogleNet作为Inception module的代表,同样取得了不错的成绩,我们的参考prototxt来自:github.com/BVLC/caffe/b

ResNet

ResNet作为新一代的模型霸主,其对模型构建的思想可谓又上了一个台阶。这里的ResNet我们参考的prototxt是github.com/KaimingHe/de

最终结果

下面揭晓最终的实验结果,并附上当年论文中或者网络上给出的单模型的精度。如果数字有错误欢迎指出。

我们一列一列来看,从模型层数来看,几年间模型的层数已经得到了爆炸式的增长,虽然GoogleNet的Inception Module和ResNet的Residual Module的网络层数都存在水分(GoogleNet官方宣称22层,ResNet官方宣称152层),但是总体上的趋势还是很明显的,那就是网络结构向着复杂的方向演变,层数也向着变深的方向演变。

对于Memory来说,除了GoogleNet(GoogleNet一般也是几个模型ensemble一起用),其他的模型的体量都比较大,在前向计算时所花费的存储还是很大的。

模型参数也是比较有意思的地方,实际上VGGNet的参数主要集中在全连接层上,而GoogleNet和ResNet在参数数量上并不算多,因为他们的层数实际上已经比较深,从层数的角度来看,模型的参数密度实际上是在减少的。

关于精度……这里就不细说了。

最后补充一句关于VGG的数据,上面的Memory计算的是1个batch所花费的内存,batch_size=256,想要对比上面的公式推演和代码计算的数字,需要把Memory的值除以batch_size。

好了,展示了这么多参数,实际上也是要说明CNN网络发展的趋势,那就是从Shallow and wide的模型转型成deep but thin的模型。模型的复杂程度不断增加,模型的拟合能力不断增强,但参数总量控制得很好,152层的ResNet和5层conv+3层fc的模型参数数量相近,其实这里面也说明了很多问题。

那么这些模型究竟是如何演化过来的呢?VGG的“模型哲学”,Inception Module的思想,ResNet对模型结构的颠覆都是如何影响我们对模型结构的三观呢?

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:447276次
    • 积分:6012
    • 等级:
    • 排名:第4640名
    • 原创:85篇
    • 转载:303篇
    • 译文:10篇
    • 评论:184条
    简介
    研二在读,关注:深度学习,计算机视觉,机器学习,图像处理。博文主要是自己的一些总结。转载文章供资料学习(转载一些最新文章),如有侵权望告知。注:有些评论没有回复,最近比较忙不好意思。
    最新评论