• 深度学习——深卷积网络:实例探究[11]


    目录

    • 三个经典网络
    • 残差网络
    • 1x1卷积
    • google inception网络
    • 迁移学习
    • 数据增强
    • 如何使用开源代码

    一、三个经典网络

    • LeNet

    [LeCun et al., 1998. Gradient-based learning applied to document recognition]

    这篇文章较早,比如现在常用max,而当时用avg,当时也没有softmax

    • AlexNet

    [Krizhevsky et al., 2012. ImageNet classification with deep convolutional neural networks]

    这篇文章让CV开始重视深度学习的使用,相对于LeNet-5,它的优点有两个:更大,使用ReLU

    same表示使用same过滤器,也就是输入和输出维度一致

    • VGG-16

    [Simonyan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition]

    16表示总共有16个CONV和FC,这篇文章指出了信道数和维度变化的规律性(随网络增加/减少),缺点是参数实在太多了

    阅读论文顺序:2-3-1

    二、残差网络

    [He et al., 2015. Deep residual learning for image recognition]

    • 残差网络基础

    残差网络由残差块组成,它使得网络可以变得更深。蓝色为正常路径,紫色为短路/跳跃连接,$a^{[l]}$的信息会直接作为$a^{[l+2]}$计算的输入(残差)。插入的位置是线性计算后,激活前

    • plain network的问题

    plain network指一般的网络。在plain network中随着深度增加,优化算法更难执行,所以可能会出现错误率先降后升的情况

    网络越深越难训练:梯度消失/爆炸的问题

    • 为什么Residual网络有用

    假设对一个大型网络再增加两层(构成残差块)

    $a^{[l+2]}=g(a^{[l]}+z^{[l+2]})\=g(a^{[l]}+w^{[l+2]}a^{[l+1]}+b^{[l+2]})$

    如果让$w^{[l+2]}=0$,$b^{[l+2]}=0$,则$a^{[l+2]}=g(a^{[l]})$

    如果$g(x)$用ReLU激活函数,则$a^{[l+2]}=a^{[l]}$

    所以,在原来的网络上加上两层,再通过残差网络,还是可以很容易学习到恒等关系

    如果不用残差网络,$a^{[l+2]}=g(z^{[l+2]})=g(w^{[l+2]}a^{[l+1]}+b^{[l+2]})$,要用这个学习到$a^{[l+2]}=a^{[l]}$,明显会比上面的方式难

    当$a^{[l+2]}$和$a^{[l]}$形状不同时,$a^{[l+2]}=W_sa^{[l]}$,增加一个$W_s$矩阵。这个矩阵可以是学习的矩阵/参数,或固定矩阵(只是对$a^{[l]}$用0进行填充,使得变成想要的矩阵)

    • 残差网络的结构图

    三、1x1卷积Network in network

    [Lin et al., 2013, Network in network]

    • 1x1卷积

    当channel=1时,1x1没有什么效果

    当channel=$n_c$时,$ReLU(n_hxn_wxn_c * (1x1xn_c)n_oc + b)=ReLU(n_hxn_wxn_oc + b)$,相当于对输入的元素运用了ReLU(非线性函数)

    • 1x1卷积的作用

    通过增加一个非线性函数使得信道数减少或保持不变(压缩信道的方法),以减少计算量

    而池化层只能是对高度/宽度进行压缩

    28x28x192 --ReLU(conv 1x1x32)-->28x28x32

    四、google Inception网络

    [Szegedy et al. 2014. Going deeper with convolutions]

    Inception可以帮你决定应该采用什么样的过滤器,是否需要pool层等

    它的做法是把各种过滤器的结果堆叠在一起

    下例中的维度是自己定义的,这样最后输出的结果中会有256个信道

    下图是一样Inception的一个基础块

    • 问题:计算量很大

    以上例中5x5过滤器为例,就需要计算120M次乘法

    例  Input: 28x28x192 filter: 5x5 same 32   output:28x28x32

    计算次数=5x5x32x28x28x32约等于120M

    解决方法:加一个1x1过滤器,也称为bottleneck层(瓶颈层,是网络中是小的层)

    28x28x192--conv 1x1x192 16-->28x28x16--conv 5x5x16 32-->28x28x32

    计算次数=28x28x192x16 + 5x5x16x28x28x32 约等于12.4M下例中计算量就会降成12.4M

    •  一个更完整些的Inception模块

    大型的Inception网络结构:

    其实就是把上面的模块重复连接。另外,网络后面几层会有一些分支。它们也和最后的输出一样进行输出,也就是说隐藏层也参与了最后输出的计算,这样可以避免过拟合的问题

    小故事:Inception原名是googlenet,是为了向LeNet致敬,而后引用了Inception(盗梦空间),意在建议更深的网络

    五、迁移学习

    在CV中经常会用到迁移学习:利用已经训练好的网络来学习其它问题。一般推荐使用开源的网络来做,而非从0开始。根据拥有的数据量不同,有不同的处理方式

    数据量很小的时候,可以把最后一层softmax替换掉,而把前面所有的层不变(一般有参数如trainable, freeze可以用于设置参数不变),只训练最后一层

    数据量大一些的时候,可以多训练几层,也就是把前几层freeze,而后面几层进行训练

    数据量很大时,可以对整个网络进行训练,原来训练好的结果作为初始值, 这样就不用用随机初始化

    六、数据扩充(augmentation)

    对于CV应用,一般来说数据越多,网络性能越好。对于其它应用可能不一定,但是对计算机视觉,数据量是一个重要的因素。数据扩充就是对原有数据进行处理以获得更多的数据

    • 常用的方法

    mirror(镜像)/random crop(随机裁剪)/rotation(旋转)/shearing(切变)/local warping(局部扭曲变形)

    改变颜色(PCA(主成分分析))

    • data augmentation(增强)的实现

    采用多线程,一个线程读取数据并修改,改后的数据传递给其它线程训练,实现数据处理与网络训练并行

    超参数:颜色要改变多少,裁剪什么位置等

    七、如何使用开源代码

    使用网络框架

    尽可能使用开源的实现

    使用预训练好的模型,并在自己的数据集上fine-tune

  • 相关阅读:
    C#读写XML no
    ComboBox、ListBox绑定和获取数据 no
    win7 安装oracle 11g no
    2011没有惊天动地 no
    Oracle 删除重复数据只留一条 no
    Oracle 创建用户并分配权限 no
    Oracle 导出、导入某用户所有数据(包括表、视图、存储过程...) no
    谢谢,博客园这么快就审批通过了我的申请!
    Eclipse 中 JAVA AWT相关包不提示问题(解决)
    Eclipse java项目转Maven项目
  • 原文地址:https://www.cnblogs.com/coolqiyu/p/8719746.html
Copyright © 2020-2023  润新知