文章目录
课堂提问
- Q1: 为什么学习ResNet中学习残差比学习直接映射要好?
- A1: 具体请阅读原论文,但是从直觉上来说,我们直接学习映射,然后网络层堆的越来越多,最后可能太复杂了,但是如果学习残差,则我们加深网络的同时只是学习的残差 ,如果学的过于复杂了,网络只需要学习残差F(X)=0,就可以将其挤掉,即一个恒等映射。
1. LeNet-5
第一次用CNN来做手写体识别,网络比较浅,只有5层。
2. AlexNet
- 其在LeNet上做了一些改进,同时由于当时GPU容量不足,其特征图的前向计算和梯度的反向传播是在两张GPU上并行进行的。
- 其获得了2012年的ImageNet的冠军
3. ZFNet
- 其在AlexNet上做了一些超参数的优化,但是主要结构还是类似的,获得了2013年的ImageNet的冠军。
4. VGGNet
- 其的关键特点是固定使用 尺寸的卷积核,和 尺寸的池化核,相比于AlexNet其的深度更深,当然,参数也更多。
Q: 为什么使用 3*3 的卷积核?
A: 两层 的 conv(步长为1),堆叠起来感受野(receptive field)与一个 7 * 7 的卷积核相同。但是,其参数量更小,而且能够组成更深的网络,更多的非线性**,形成的特征更丰富。即参数量为
Q: 3个 的卷积核的有效感受野为多大?
A: ,可参考另一篇博客CNN中感受野的初步计算。
下面显示VGG16的每层的参数设置和总参数量:
- 可以看到存储量主要是在前几层的卷积层中,所以,对于后面的卷积层我们可以适当的增加通道数来丰富特征表达;
- 而参数量主要几种在全连接层,因为FC层是密集连接;
总结
5. GoogleNet
GooleNet是ILSVRC’14的分类冠军,VGGNet是第二名。它是一个更深的网络,有22层,但是参数量更少。
它设计了一个特殊的 inception 模块来进行组合卷积。然后再每一层中叠加该模块,同时顶层没有使用全连接层,减少了大量的参数量。
Inception模块
- 该模块可以看成一个子网络,对输入的特征图进行不同尺度的卷积操作,来捕获输入中不同尺度的信息。然后在深度上将输出串联。
- 但是这种模块也会产生计算性能的问题,同时我们的输出深度会越来越大(其中池化操作深度不变),例如:(卷积尺度保持不变是通过零填充)
- 而其中一个解决方案就是我们在卷积操作之前使用 的卷积来减少深度,称为 沙漏层(Bottleneck)。
其它部分
除了叠加Inception之外,GoogleNet还有其它小细节:
- 主干网络(stem network): 先使用普通的卷积池化操作预处理
- 尾端:没有使用太多的FC层
- 辅助分支:为了使得前面几个层的参数也能得到训练,在中间添加辅助预测分支,帮助梯度更好的训练(至于最后是否有使用到多个分支来进行平均预测,请移步原论文)
6. ResNet (残差网络)
通过残差块使得网络在深度上得到了一个飞跃,在一定程度上解决了网络深度越深梯度传播越困难的问题。
引入
深度网络的优化困难问题:普通的网络增加深度后性能降低
我们的直觉应该是:深层的网络不应该比浅层的表现差。
一个解决方案是:从浅层网络复制权重,然后增加一些网络层来学习恒等映射(identity mapping)。
但是ResNet中的做法却和这个不太一样,其转成成学习一个残差(residual mapping):
- 如上图,我们新增加网络层来学习我们的残差 Residual Mapping,如果 中间没有权重层,则其是一直不变地,这更像是学习如何去修正我们的X,而不是学习它本身。
即从某种意义上来说,它并不是像普通网络那样去学习我们输入的X该怎么去映射,即直接学习一个H(X)。而是去学习一个残差F(X) = H(X) - X,然后去修正我们的X,即H(X) = F(X) + X。如果网络已经OK了,就不用修正了,即残差为0。
- 同时,这种残差结构有利于上流梯度的传播,因为加法门有一个分支能直接复制上流的梯度。
结构
ResNet的基本结构如下图:
- 其最后没有增加额外的FC层,只是先用平均池化来Pool,再添加分类的FC层。
- 对于比较深的ResNet,其也有沙漏层(Bottleneck)来减少计算量。
- 训练细节
7. 比较
8. 一些别的架构
总结
推荐阅读
- Convolutional Neural Networks: Architectures, Convolution / Pooling Layers
- Understanding and Visualizing Convolutional Neural Networks
- Transfer Learning and Fine-tuning Convolutional Neural Networks