深度学习——深卷积网络:实例探究[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

原文地址:https://www.cnblogs.com/coolqiyu/p/8719746.html