深度卷积网络:实例探究
1. 为什么要进行实例探究
学习前辈们组建网络的方法,借鉴过来解决自己的问题。
经典的网络模型:
- LeNet-5
- AlexNet
- VGG
- ResNet
- Inception
2. 经典网络
3. 残差网络 ResNets
非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题
- 中间的激活能够到达网络的更深层
- 这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能
- ResNet 在训练深度网络方面非常有效
4. 残差网络为什么有用
残差网络起作用的主要原因:
- 残差块学习恒等函数非常容易,你能确定网络性能不会受到影响,很多时候甚至可以提高效率,或者说至少不会降低网络的效率
个人理解,之前的网络都是单向传递,有点像链表,当前层只与上一层有关,且只影响下一层;而残差网络结构则突破了这一模式,将当前层的影响不仅影响到下一层,而且影响到接下来的多个层,有点像图结构,并且从实践效果看,效果不错。我们知道,深度学习会通过隐藏层的不断加深,来抽象组合成更加全面的特征。
另外,我觉得当今深度学习最让人诟病的地方在于其黑箱不可解释性,所以,我们不能只局限于已有的结构模型图,而是多开放思路,设计更多新颖的网络结构,来逼近人类大脑的性能。
5. 网络中的网络 以及 1×1 卷积
我们知道,可以通过池化层来压缩输入的高度和宽度,但是池化层不改变通道数
1×1卷积层 给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,也可以增加通道数量
6. 谷歌 Inception 网络简介
构建卷积层时,你要决定过滤器的大小究竟是1×1,3×3 还是 5×5,要不要添加池化层。
而 Inception网络 的作用就是代替你来决定,虽然网络架构变得更加复杂,但网络表现却非常好
基本思想是:
Inception 网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合
通过使用1×1卷积来构建瓶颈层,从而大大降低计算成本
事实证明,只要合理构建瓶颈层,既可以显著缩小表示层规模,又不会降低网络性能,从而节省了计算
7. Inception 网络
Inception 模块:
Inception 网络:Inception 模块堆叠
8. 使用开源的实现方案
事实证明很多神经网络复杂细致,因而难以复制,因为一些参数调整的细节问题,例如学习率衰减等等,会影响性能
- 选择一个你喜欢的神经网络框架
- 接着寻找一个开源实现,从GitHub下载下来,以此基础开始构建
这样做的优点在于,这些网络通常都需要很长的时间来训练,而或许有人已经使用多个GPU,通过庞大的数据集预先训练了这些网络,你就可以使用这些网络进行迁移学习
9. 迁移学习
10. 数据增强 Data augmentation
数据扩充是经常使用的一种技巧来提高计算机视觉系统的表现
- 垂直镜像对称(常用)
- 随机裁剪(常用)
- 旋转,剪切(局部扭曲)(不常用)
- 色彩转换(给RGB通道按分布加上失真值),使得算法对照片的颜色更改更具鲁棒性
常用的实现数据扩充的方法:
- 使用一个线程或者是多线程,用来加载数据,实现变形失真
- 然后传给其他的线程或者其他进程,来训练,可以并行实现
数据扩充过程中也有一些超参数,比如,颜色变化,随机裁剪参数。
另外,可以使用别人的开源实现,了解他们如何实现数据扩充。也可以自己去调整这些参数
11. 计算机视觉现状
为了提高性能表现:
- 集成:使用多个神经网络,平均他们的输出,缺点,更多的时间,占用内存更大
- Multi-crop 数据扩充,也是运行时间多,只有1个神经网络占用内存