目前,卷积神经网络领域有几种家喻户晓的体系结构,包括:

  • LeNet。卷积网络的第一个成功应用是由Yann LeCun在20世纪90年代开发的。其中最著名的是用于读取邮政编码、数字等的LeNet架构。
  • AlexNet。在计算机视觉中普及卷积网络的第一项工作是Alex Krizhevsky、Ilya Sutskever和Geoff Hinton开发的AlexNet。AlexNet在2012年被提交到ImageNet ILSVRC挑战赛,并显著优于亚军(top5的错误率为16%,亚军的错误率为26%)。该网络的体系结构与LeNet非常相似,但是更深、更大,并且具有多层的卷积层(以前通常只有一个CONV层,后面总是紧接着一个POOL层)。
  • ZF Net。ILSVRC 2013的获胜者是Matthew Zeiler和Rob Fergus的一个复杂网络。它被称为ZFNet(Zeiler&Fergus Net的缩写)。它是对AlexNet的一个改进,通过调整结构超参数,特别是通过扩展中间卷积层的大小,并使第一层的步长和过滤器大小更小。
  • GoogLeNet。ILSVRC 2014的获胜者是来自谷歌的Szegedy等人的卷积网络。它的主要贡献是开发了一个Inception模块,大大减少了网络中的参数数量(4M,而AlexNet有60M)。此外,这个网络在ConvNet的顶部使用平均池化层而不是全连接层,从而消除了大量似乎无关紧要的参数。GoogLeNet还有几个后续版本,比如Inception-v4
  • VGGNet。2014年ILSVRC的亚军是来自Karen Simonyan和Andrew Zisserman的网络,被称为VGGNet。它的主要贡献在于表明网络的深度是良好性能的关键组成部分。他们最终的最佳网络包含16个CONV/FC层,并且,它具有一个非常同质的架构,从开始到结束只执行3x3的卷积和2x2的池化。他们的预训练模型可在Caffe即插即用。VGGNet的一个缺点是,它的计算成本更高,并且使用了更多的内存和参数(140M)。这些参数中的大多数都在第一个全连接层中。不过,后来发现可以在不降低性能的情况下移除这些FC层,从而显著减少了必要参数的数量。
  • ResNet。由Kaiming He等人开发的ResNet是ILSVRC 2015的获胜者。它的特点在于skip connections和大量使用batch normalization。该体系结构还不需要在网络末端使用全连接层。更详细的内容可以参考Kaiming的演示(视频幻灯片),以及最近在Torch中复制这些网络的一些实验。ResNet是目前最先进的卷积神经网络模型,是实际中使用convnet的默认选择(截至2016年5月10日)。特别是,还可以从Kaiming He等人的Identity Mappings in Deep Residual Networks(2016年3月出版)中看到更多调整原始架构的最新进展。

  最后,将VGGNet的细节作为一个案例来详细分析一下。整个VGGNet由CONV层和POOL层组成,CONV层是步长为1和padding为1的3x3卷积,POOL层用步幅为2的2x2最大池化(没有padding)。我们可以在处理的每个步骤中写出表示的大小,并跟踪表示大小和权重总数:

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

  需要注意的是,大部分内存(以及计算时间)都用在前面的CONV层中,而大部分参数都用在最后的FC层中。在这里,第一个FC层包含100M的数据,而FC层总共占用140M的内存。