Coursera | Andrew Ng (04-week2)—Case studies
在吴恩达深度学习视频以及大树先生的博客提炼笔记基础上添加个人理解,原大树先生博客可查看该链接地址大树先生的博客- ZJ
CSDN:http://blog.csdn.net/junjun_zhao/article/details/79200029
week2 Case studies 实例探究
2.1 为什么要进行实例探究?(Why look at case studies?)
上周学习了基本构建,如卷积层 、池化层以及全连接层等这些组件,事实上,计算机视觉研究中的大量研究都集中在如何把这些基本构建组合起来,形成有效的神经网络?
最好的方法:看案例。
一些好的神经网络框架,有可能也适用于解决你的问题。
提纲:
2.2 经典的卷积网络
介绍几种经典的卷积神经网络结构,分别是 LeNet、AlexNet、VGGNet。
LeNet-5:
LeNet-5 主要是针对灰度设计的,(识别手写数字)所以其输入较小,为 32×32×1,其结构如下:
在 LetNet 中,存在的经典模式:
- 随着网络的深度增加,图像的大小在缩小,与此同时,通道的数量却在增加;
- 每个卷积层后面接一个池化层。Conv - pool -Conv -pool -fc -fc
- 参数相对较少
AlexNet:
AlexNet 直接对彩色的大图片进行处理,其结构如下:
- 与 LeNet 相似,但网络结构更大,参数更多 ,表现更加出色;
- 使用了 Relu;
- 使用了多个 GPUs;
- LRN(后来发现用处不大,丢弃了)
AlexNet 使得深度学习在计算机视觉方面受到极大的重视。
VGG-16:
简化神经网络结构。VGG 卷积层和池化层均具有相同的卷积核大小,都使用 3×3,stride=1,SAME 的卷积和 2×2,stride=2 的池化。其结构如下:
- 包含 16 个卷积层和全连接层,很大的网络,1.38 亿个参数。
相关论文阅读:AlexNet – VGG-16 –LeNet -5
2.3 残差网络 ResNet(Residual Networks)
极深的网络是非常难训练的,存在梯度消失和梯度爆炸问题,为解决这一问题,学习使用跳远连接帮助构建能够训练深度网络的 ResNet。
ResNet 是由残差块所构建。
残差块:
下面是一个普通的神经网络块的传输:
其前向传播的计算步骤为:
Linear:
z[l+1]=W[l+1]a[l]+b[l+1]
z
[
l
+
1
]
=
W
[
l
+
1
]
a
[
l
]
+
b
[
l
+
1
]
Relu:
a[l+1]=g(z[l+1])
a
[
l
+
1
]
=
g
(
z
[
l
+
1
]
)
Linear:
z[l+2]=W[l+2]a[l+1]+b[l+2]
z
[
l
+
2
]
=
W
[
l
+
2
]
a
[
l
+
1
]
+
b
[
l
+
2
]
Relu:
a[l+2]=g(z[l+2])
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
)
而 ResNet 块则将其传播过程增加了一个从 a[l] a [ l ] 直接到 z[l+2] z [ l + 2 ] 的连接,将其称之为“short cut”或者“skip connection”:
也就是前向传播公式的最后一个步骤变为:
a[l+2]=g(z[l+2]+a[l])
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
+
a
[
l
]
)
增加“short cut”后,成为残差块的网络结构:
注意这里是连接在 Relu 激活函数之前。
Residual Network:
多个残差块堆积起来构成 ResNet 网络结构,其结构如下:
没有“short cut”的普通神经网络(Plain)和 ResNet 的误差曲线:
- 在没有残差的普通神经网络中,训练的误差实际上是随着网络层数的加深,先减小再增加;
- 在有残差的 ResNet 中,即使网络再深,训练误差都会随着网络层数的加深逐渐减小。
ResNet 对于中间的激活函数来说,有助于能够达到更深的网络,解决梯度消失和梯度爆炸的问题。
2.4 ResNet 表现好的原因 (Why ResNets works?)
假设有个比较大的神经网络,输入为 x,输出为 a[l] a [ l ] 。如果我们想增加网络的深度,这里再给网络增加一个残差块:
假设网络中均使用 Relu 激活函数,所以最后的输出 a⩾0 a ⩾ 0 。这里我们给出 a[l+2] a [ l + 2 ] 的值:
a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l]) a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) = g ( W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ] + a [ l ] )
如果使用 L2 正则化或者权重衰减 (weight decay),会压缩 W 和 b 的值,如果 W[l+2]=0 W [ l + 2 ] = 0 同时 b[l+2]=0 b [ l + 2 ] = 0 ,那么上式就变成:
a[l+2]=g(z[l+2]+a[l])=g(a[l])=relu(a[l])=a[l] a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) = g ( a [ l ] ) = r e l u ( a [ l ] ) = a [ l ]
所以从上面的结果我们可以看出,对于残差块来学习上面这个恒等函数是很容易的。所以在增加了残差块后更深的网络的性能也并不逊色于没有增加残差块简单的网络。所以尽管增加了网络的深度,但是并不会影响网络的性能。同时如果增加的网络结构能够学习到一些有用的信息,那么就会提升网络的性能。
同时由于结构 a[l+2]=g(z[l+2]+a[l]) a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) ,ResNet 在设计中使用了很多相同的卷积 (SAME),以保持 z[l+2] z [ l + 2 ] 和 a[l] a [ l ] 的维度相同。
将普通深度神经网络变为 ResNet:
在两个相同的卷积层之间增加“skip connection”。
2.5 网络中的网络以及 1x1卷积 (Network in Network and 1x1 convolutions)
1x1卷积:
在二维上的卷积相当于图片的每个元素和一个卷积核数字相乘。
但是在三维上,与 1×1×nC 1 × 1 × n C 卷积核进行卷积,相当于三维图像上的 1×1×nC 1 × 1 × n C 的切片,也就是 nC n C 个点乘以卷积数值权重,通过 Relu 函数后,输出对应的结果。而不同的卷积核则相当于不同的隐层神经元结点与切片上的点进行一一连接。
所以根本上 1×1 卷积核相当于对一个切片上的 nC n C 个单元都应用了一个全连接的神经网络。
最终三维的图形应用 1×1 的卷积核得到一个相同长宽但第三维度变为卷积核个数的图片。
1x1卷积应用:
- 维度压缩:使用与目标维度相同的 1×1 的卷积核个数。
- 增加非线性:保持与原维度相同的 1×1 的卷积核个数。
2.6 Inception Network motivation
Inception Network 的作用就是使我们无需去考虑在构建深度卷积神经网络时,使用多大的卷积核以及是否添加池化层等问题。
Inception主要结构:
在上面的 Inception 结构中,应用了不同的卷积核,以及带 padding (same)的池化层。在保持输入图片大小不变的情况下,通过不同运算结果的叠加,增加了通道的数量。
计算成本的问题:
对于上面的 5×5 大小卷积核的计算成本:
- 1 filters:5×5×192;
- 32 个 filters;
- 总的计算成本:28×28×32×5×5×192=120M
对于1×1大小卷积核用作过渡的计算成本,也将下面的中间的层叫做瓶颈层 “bottleneck layer”:
- 1×1 卷积层计算成本:28×28×16×1×1×192=2.4M
- 5×5 卷积层计算成本:28×28×32×5×5×16=10.0M
- 总的计算成本:2.4M+10.0M=12.4M
所以 1×1 卷积核作为 bottleneck layer” 的过渡层能够有效减小卷积神经网的计算成本。事实证明,只要合理地设置 “bottleneck layer”,既可以显著减小上层的规模,同时又能降低计算成本,从而不会影响网络的性能。
2.7 Inception network
Inception module 模块:
将上面说介绍的两种主要思想和模式结合到一起构成 Inception 模块,如下:
Inception Network:
多个 Inception 模块的堆叠构成 Inception Network,下面是 GoogleNet 的结构:
下方的分支的作用,通过隐藏层做预测,softmax output,确保即便是隐藏单元和中间层 也参与了运算,也可以做预测,起到调整的作用,也能够防止网络发生过拟合。
Inception 名字来源:
2.8 使用开源的实现方案 (Using open-source implementations)
Practical advice for using ConvNets
直接实现论文一般比较困难,涉及到很多参数的调整,太多的细节,所以最快学习的方法是,在 Github 找一个开源实现的方案来学习。
假如你在开发一款 CV 应用,常见的工作流程是:
- 选择一个不错的架构
- 找一个开源实现 from Github
- 这样可以使用 里面的数据集 来进行 迁移学习。某种程度上解决了数据的问题。
2.9 迁移学习 (Transfer learning)
小数据集:
如今在深度学习领域,许多研究者都会将他们的工作共享到网络上。在我们实施自己的工作的时候,比如说做某种物体的识别分类,但是只有少量的数据集,对于从头开始训练一个深度网络结构是远远不够的。
但是我们可以应用迁移学习,应用其他研究者建立的模型和参数,用少量的数据仅训练最后自定义的 softmax 网络。从而能够在小数据集上达到很好的效果。之前的网络都进行 freeze 操作。
大数据集:
如果我们在自己的问题上也拥有大量的数据集,我们可以多训练后面的几层。总之随着数据集的增加,我们需要“ freeze”的层数越来越少。最后如果我们有十分庞大的数据集,那么我们可以训练网络模型的所有参数,将其他研究者训练的模型参数作为参数的初始化来替代随机初始化,来加速我们模型的训练。
解决了我学习依赖,一直在思考的问题,数据来源问题,同时,也让我学到了 参数初始化的问题,如果是类似的数据,也可以直接之前开源项目中已经训练好的权重,参数进行初始化。
2.10 数据扩充 (Data augmentation)
与其他机器学习问题相比,在计算机视觉领域当下最主要的问题是没有办法得到充足的数据。所以在我们训练计算机数据模型的时候,数据的扩充就是会非常有用。
数据扩充的方法:
- 镜像翻转(Mirroring);
- 随机剪裁(Random Cropping);
- 色彩转换(Color shifting):
为图片的RGB三个色彩通道进行增减值,如(R:+20,G:-20,B:+20);PCA 颜色增强:对图片的主色的变化较大,图片的次色变化较小,使总体的颜色保持一致。
训练过程中的数据扩充:
为了节省时间,数据扩充的过程和训练过程可以多 CPU 多线程来并行的实现。
2.11 计算机视觉现状 (The state of computer vision)
数据和手工工程:
不同问题当前的数据集大小:
在有大量数据的时候,我们更倾向于使用简单的算法和更少的手工工程。因为此时有大量的数据,我们不需要为这个问题来精心设计特征,我们使用一个大的网络结果或者更简单的模型就能够解决。
相反,在有少量数据的时候,我们从事更多的是手工工程。因为数据量太少,较大的网络结构或者模型很难从这些少量的数据中获取足够的特征,而手工工程实际上是获得良好表现的最佳方式。
对于机器学习应用:
- 标记数据,(x,y);
- 手工特征工程/网络结构/其他构建。
Tips for doing well:
在基准研究和比赛中,下面的 tips 可能会有较好的表现:
- Ensembling:独立地训练多个网络模型,输出平均结果或加权平均结果;
- 测试时的 Multi-crop:在测试图片的多种版本上运行分类器,输出平均结果。10 -crop : 2 张一样的,2 张镜像的,依次取中间,四个角,中间 ,四个角,共 10 张,在比赛中,如果 效果能好 1% 2% 可能就会赢得比赛。
(建议:构建生产系统时,尽量不要使用)
参考文献:
[1]. 大树先生.吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(4-2)– 深度卷积模型
PS: 欢迎扫码关注公众号:「SelfImprovementLab」!专注「深度学习」,「机器学习」,「人工智能」。以及 「早起」,「阅读」,「运动」,「英语 」「其他」不定期建群 打卡互助活动。