• Cs231n课堂内容记录-Lecture 9 深度学习模型


    Lecture 9 CNN Architectures

    参见:https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_83

    一、 LeNet-5:

     

    神经网络的第一个实例,用于识别邮票上的手写数字,使用步长为1,大小为5*5的卷积核,对第一层进行操作,然后进行池化,通过几层卷积和池化,在网络的最后还有一些全连接层。LeNet在数据识别领域取得了成功。

    二、 AlexNet

     

    Alexnet是2012年ImageNet中胜出的模型,将错误率从25.8%降低至16.4%。

    1.网络结构:

    [227x227x3] INPUT

    [55x55x96] CONV1: 96 11x11 filters at stride 4, pad 0

    [27x27x96] MAX POOL1: 3x3 filters at stride 2

    [27x27x96] NORM1: Normalization layer

    [27x27x256] CONV2: 256 5x5 filters at stride 1, pad 2

    [13x13x256] MAX POOL2: 3x3 filters at stride 2

    [13x13x256] NORM2: Normalization layer

    [13x13x384] CONV3: 384 3x3 filters at stride 1, pad 1

    [13x13x384] CONV4: 384 3x3 filters at stride 1, pad 1

    [13x13x256] CONV5: 256 3x3 filters at stride 1, pad 1

    [6x6x256] MAX POOL3: 3x3 filters at stride 2

    [4096] FC6: 4096 neurons

    [4096] FC7: 4096 neurons

    [1000] FC8: 1000 neurons (class scores)

    FC8与softmax层相连,进行1000个类别的ImageNet的图像分类。

    2.关于第一层形状和参数数量的计算(number of parameters

     

    output_size = (input_size-filter_size)/stride +1

     

    parameters_num = filter_size*filter_number

     

    比较有趣的是,池化层参数数量为零。因为它只对参数做了较少操作,只是观察卷积层已有的参数,然后取了最大值。

    3.AlexNet网络特点

    First use of ReLU;

    Used Norm layers (not common anymore);

    Heavy data augmentation;

    Dropout 0.5;

    Batch size 128;

    SGD Momentum 0.9;

    Learning rate 1e-2, reduced by 10 manually when val accuracy plateaus;

    L2 weight decay 5e-4(正则化的权重衰减);

    7 CNN ensemble: 18.2% -> 15.4%(模型集成,取平均)。

    由于当时所使用GPU的显存不够存放这么多参数,因此从第一个卷积层开始将参数分为两组,在两个GPU中训练。

    三、 ZFNet

    ZFNet是2013年ImageNet获胜的模型,在超参数上对AlexNet进行了改进。

     

    ZFNet网络特点

    ZFNet框架大体与AlexNet一致。它们具有相同的层数,基本结构;在步长上有一点改进,卷积核数量上也略有不同。

    四、 VGGNet

    VGGNet和GoogleNet是14年胜出的模型,它们与之前的网络最大的不同之处在于拥有了更深层的网络,分别是19层、22层。GoogleNet与VGGNet很相近,实际上是VGGNet的一个本地化的改进,两者的鲁棒性都很好。

     

    VGG16网络详细信息:

    INPUT: [224x224x3] memory: 224x224x3=150K params: 0

    CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x3)x64 = 1,728

    CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x64)x64 = 36,864

    POOL2: [112x112x64] memory: 112x112x64=800K params: 0

    CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x64)x128 = 73,728

    CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x128)x128 = 147,456

    POOL2: [56x56x128] memory: 56x56x128=400K params: 0

    CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x128)x256 = 294,912

    CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824

    CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824

    POOL2: [28x28x256] memory: 28x28x256=200K params: 0

    CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x256)x512 = 1,179,648

    CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296

    CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296

    POOL2: [14x14x512] memory: 14x14x512=100K params: 0

    CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296

    CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296

    CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296

    POOL2: [7x7x512] memory: 7x7x512=25K params: 0

    FC: [1x1x4096] memory: 4096 params: 7x7x512x4096 = 102,760,448

    FC: [1x1x4096] memory: 4096 params: 4096x4096 = 16,777,216

    FC: [1x1x1000] memory: 1000 params: 4096x1000 = 4,096,000

    TOTAL memory: 24M * 4 bytes ~= 96MB/image (only forward) (每个数字占用四字节内存)

    TOTAL params : 138M parameters。

    前向传播占用的总内存约为每张图像96MB,算入反向传播的话加倍即可。

    VGGNet网络特点:

    更小的filters,更深的网络;

    Only 3x3 CONV stride 1, pad 1 and 2x2 MAX POOL stride 2

    这种卷积核已经是最小的卷积核了,网络只关注相邻的像素。整个网络保持这种小卷积核的结构、并进行下采样,简洁而优雅,获得了ImageNet最好的7.3的错误率。

    为什么使用小的卷积核?当使用小卷积核时,3个3x3的卷积层和1个7x7的卷积层拥有同样有效的感受野,但是小卷积核可以让我们尝试更深层的网络和更多的卷积核,更非线性化,最终的效果比大卷积核的效果要好,且其参数数量更少,3x(3x3)<7x7。

    倒数第二层FC(FC7,1000个,即类别层之前)的hidden number=4096被验证已经能够很好地进行特征表达,可以用于在其他数据中提取特征,并有比较好的泛化性能;

    作者先训练了一个11层的网络,使其收敛,之后将其扩展到16/19层,以此来解决深层网络收敛困难的问题(Batch Normalization提出后就不需要这种操作了);

    五、GoogleNet

     

    1.GoogleNet网络特点:

    l   22层网络;

    l   没有FC层,因此节省了大量参数,仅有5million,比AlexNet少了12倍;

    l   为提高计算效率引入了“inception” module和“bottleneck”的概念;

    l   网络有两个辅助输出(Auxiliary classification outputs)用于向低层的网络注入额外的梯度,以此解决网络收敛困难的问题(Batch Normalization提出后就不需要这种操作了);

    2.“inception” module

    可以将网络看成是由局部网络拓扑(“inception” module)堆叠而成。对进入相同层的相同输入并行应用不同类别的滤波操作。我们将来自前面层的输入进行不同的卷积操作、池化操作,从而得到不同的输出,最后需要将所有输出在深度层面上连接到一起。计算与串联方式如下图所示:

     

    我们通过inception操作在保持形状不变的情况下扩充了深度。为什么在经过不同的滤波器后我们总是能得到相同的尺寸?为了让输出尺寸和输入尺寸保持一致,我们使用的方法是零填充(zero padding)。另外,输入中的256是上一层中输入的深度。

    池化层在这个问题中也参与了运算,它保留了模型的深度,因此在每一层深度只能增加。

    另外通过计算我们可以发现,卷积层的参数数量或者操作数量达到了854M,计算量极大。

    3.“blottleneck”(瓶颈层):

    使用 “inception” module 后随之而来的问题就是:

    l   单层的参数就达到854M个,计算量极大;

    l   且数据经过每一个 “inception” module 后深度都会增加(光池化层得到输出数据的尺寸就已经与原数据相同)。

    为解决上述问题,构建了称之为“bottleneck”的1x1卷积层以减少特征深度(如下图所示):

    改进后的“inception” module如下图所示:

    Bottleneck的目的是在卷积运算之前降低特征图的维度。我们运用之前提到过的1*1卷积核,它能够保持形状不变,减小深度,从而降低特征图的维度。

    对于Bottleneck减小运算量的具体计算:对于相同的输入大小28*28*256,我们将计算量减少到了358M。

    用1*1卷积核是否会导致一些信息丢失?结果可能会有一些信息丢失,但这样的效果更好,对于处理计算复杂性这一点来说。

    4.Full GoogleNet Architecture:

     

    Stem Network更像我们之前见过的正常的CNN结构。

     

    我们将初始模块堆叠在一起

     

    在堆栈的顶部有分类输出。全连接层已经被移除,没有FC工作效果依然很好,还节省了很多参数。

    5.Auxiliary classification outputs

    GoogleNet同时拥有两个辅助输出,它们是使用Softmax函数的一个带有平均池化的小网络,具有平均池化、1*1卷积、FC*2、Softmax分类的结构(相当于我们提前进行了分类输出),可以对前面几个层进行更多的梯度训练。当网络深度很深的时候,一些梯度信号会最小化并且丢失了前面几层的梯度信号,该方法能在一定程度上解决梯度消失的问题。

    五、ResNet

    1.ResNet网络特点:

    l   152层;

    l   利用残差层实现优化;

    l   网络由残差盒堆叠而成(每一个残差盒包含两个3x3 CONV);

    l   如果将残差盒中的所有权重置零,那么残差盒的输出与输入就是相等的,因此,在某种层度上,这个模型是相对容易去训练的,并不需要添加额外的层;

    l   神经网络中添加L2正则化的作用是迫使网络中的所有参数趋近于0,其他网络结构(如CONV)参数趋于0不太说得通。但在残差网络中,如果所有参数趋于0,那就是促使模型不再使用他不需要的层,因为它只趋使残差盒趋向同一性,也就不需要进行分类;

    l   残差连接在反向传播时,为梯度提供了一个超级“高速通道”(梯度经过残差盒的加法门分流然后汇总),这使得网络训练更加容易(DenseNet和FractalNet也有类似的梯度直传式的连接);

    l   周期性的,会使用两倍数量的filters,用stride 2 CONV进行下采样(所有维度/2);

    l   网络起始处有一个额外的CONV;

    l   没有额外的FC;

    l   只有一个全局的AVE POOL;

    l   每一个CONV后都带有一个BN;

    l   用一个额外的带尺度因子的Xavier/2去初始化;

    l   初始学习率为0.1,当Validation error停滞时,将其缩小十倍;

    l   Mini-batch size = 256;

    l   Weight decay = 1e-5.

    2.残差盒(Residual block):

    当我们在普通卷积神经网络[1]上堆叠越来越多的层时到底会发生什么?我们以VGG或者其他的一般网络为例,我们能仅仅通过扩展更多的层来得到更好的效果吗?答案是不能。

    由上图实验结果可知,56层网络的训练误差和测试误差都高于20层的网络。按理说。56层的NN拥有很多参数和更深的层数,应该会更早地达到过拟合,从而拥有更低的训练误差和更高的测试误差。但是实验表明56层的NN的训练误差比20层的NN更高了。

    ResNet的作者假设:这是一个优化问题,层深的模型更难优化。于是,作者提出了残差网络的概念,其与常规网络的区别如下图所示:

     

    Residual block使这些网络层拟合的是残差映射H(x)-x而不是直接映射H(x)。某种意义上可以看成是一种对输入的修正。之前我们学习的是H(x),现在我们把最终的表达分解为F(x)+x,从而只需学习F(x),F(x)就是我们所说的残差。通常来说,网络的层与层之间实际上相差不大的,一个恒等映射(x到x本身)加上很小的∆x(若恒等映射是最好的,只需将∆x置零)的学习过程更容易实现。

    与GoogleNet类似,如果网络层数较多的话,ResNet的残差盒可以使用“bottleneck”来加速计算(如下图所示)。

     

    六、扩展知识:

    1.Network in Network(NiN):

    每个卷积层中都有一个完全连接的MLP(micronetwork),以计算局部图像块的更多抽象特征。这个模型是GoogleNet和ResNet模型“bottleneck”的灵感来源。

    2.Identity Mappings in Deep Residual Networks

    在ResNet的基础上进行修改,新的结构能够实现一种更直接的路径用于在整个网络中传播信息(将激活层移动到残差映射路径中)。

    3.Wide Residual Networks

    作者认为残差量是一个十分重要的因素而不是深度。使用了更宽的残差模块(FxK filters而不是F filters in each layer),宽网络的另一个优点是便于使用并行计算。本文旨在比较网络的宽度、深度和残差连接所做出的贡献。

     

    4.ResNeXt

    通过多条平行路径增加残差盒宽度,这些分支总和被称为“cardinality”,思想类似于“inception”module。

         

    5.Deep Networks with Stochastic Depth

    动机是在训练过程中通过短网络减少消失梯度和训练时间。该思想类似于Dropout,只不过这里是沿网络深度方向的dropout。方法是在每次训练中随机drop某层子集(即ResNet中∆x=0,该层为恒等映射),在测试时使用完整的训练好的网络。

    6.FractalNet

    作者认为引入残差可能不是必须的,关键在于有效地从浅层网络转型为深层网络。因此他使用了上图所示这种分型结构,各层都以分形的形式存在,因此同时存在浅层和深层路径到大输出值。他们通过抛弃子路径的方式训练,类似于dropout,测试时使用整个分形网络。

     

    7.DenseNet

    密集连接卷积神经网络。每个Dense block中每层都与其后的所有层以前馈的形式连接,因此在这个Dense block内,你对其的输入也是对所有其他各层的输入,你会计算每一个卷积输出,这些输出与其后的所有层连接,所有这些值集中起来,共同作为卷积层的输入。这一方法能缓解梯度消失的问题,加强特征图的传递,鼓励特征的再利用。

     

    8.SqueezeNet

    关注于构建高效网络,压缩网络的大小。由一个个fire模块组成,每个fire模块都含有一个squeeze层,其由许多1x1的filters组成。接着,它再传递给一个扩大层含有一些1x1和3x3的filters。参数只有AlexNet的1/50,性能相似。



    [1] plain convolutional neural network专指不带残差功能的卷积神经网络。

  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/yun-an/p/10293841.html
Copyright © 2020-2023  润新知