1. 三个经典网络
红色部分不重要,现在已经不再使用
这篇文章较早,比如现在常用max,而当时用avg,当时也没有softmax
这篇文章让CV开始重视DL的使用,相对于LeNet-5,它的优点有两个:更大,使用ReLU
以作者名字命名
same表示使用same过滤器,也就是输入和输出维度一致
16表示总共有16个CONV和FC,这篇文章指出了信道数和维度变化的规律性(随网络增加/减少),缺点是参数实在太多了
阅读论文顺序:2-3-1
2. 残差网络
残差网络由残差块组成,它使得网络可以变得更深
a[l]到a[l+2]的蓝色是网络的主路径,而紫色部分称为短路/跳跃连接,直接把a[l]的信息传递到下下一层,计算a[l+2]时会加上a[l](残差),它插入的位置是线性计算后,激活前
plain network是一般的网络
在plain network中随着深度增加,优化算法更难执行,所以可能会出现错误率先降后升的情况
网络越深越难训练:梯度消失/爆炸的问题
3. 为什么Residual网络有用
假设对一个大型网络再增加两层(构成残差块)
计算a[l+2]时,如果w为0,b也为0,且使用ReLu函数,那么我们可以得到a[l+2] = a[l],这说明残差网络可以很容易学习恒等函数
因此,增加网络深度不会损害性能,而plain网络当深度增加时可能连恒等函数都不容易学习??
如果z[l+2]和a[l]维度一致就正好,如果不一样的话,那么可以在a[l]前乘以一个矩阵,不需要对矩阵进行处理??
残差网络的结构图
4. 1x1卷积
1x1卷积做事情是:(以下面32信道为例)
对输入的32个元素(32个信道)作一个全连接,然后执行ReLU函数,得到一个实数,作为相应位置上的结果。如果有多个过滤器,则进行叠加
这个也称为网络中的网络
为什么可以用1x1来压缩?这样如果采用一样的过滤器,结果是不一样的吧????
1x1卷积的作用
通过增加一个非线性函数使得信道数减少或保持不变(压缩信道的方法),以减少计算量
使用32个1x1x192的过滤器
5. google Inception网络
Inception可以帮你决定应该采用什么样的过滤器,是否需要pool层等
它的做法是把各种过滤器的结果堆叠在一起
下例中的维度是自己定义的,这样最后输出的结果中会有256个信道
下图是一样Inception的一个基础块
Inception的一个最大问题:计算量很大
以上例中5x5过滤器为例,就需要计算120M次乘法
解决方法:加一个1x1过滤器,也称为bottleneck层(瓶颈层,是网络中是小的层)
下例中计算量就会降成12.4M
6. 一个更完整些的Inception模块
论文中的网络结构
其实就是把上面的模块重复连接,另外,网络后面几层会有一些分支(绿色划圈部分),它们也是和最后的输出一样进行输出,也就是说隐藏层也参与了最后y hat的输出,这样可以避免过拟合的问题
小故事:Inception原名是googlenet,是为了向LeNet致敬,而后引用了Inception(盗梦空间),意在建议更深的网络
6. 迁移学习
在CV中经常会用到迁移学习。一般推荐使用开源的网络来做,而非从0开始。根据拥有的数据量不同,有不同的处理方式,从上到下数据量递增
例:要训练一个识别猫的网络(3个转出)
当数据量很小的时候,可以把最后一层softmax替换掉,而把前面所有的层不变(一般有参数如trainable, freeze可以用于设置参数不变),只训练最后一层
另外,可以把最后的隐藏层的结果保存下来,然后直接将输入映射。这样就不用经过中间层的计算
当数据量大一些的时候,可以多训练几层,也就是把前几层freeze,而后面几层进行训练
当数据量很大时,可以对整个网络进行训练,原来训练好的结果作为初始化值, 这样就不用用随机初始化
7. 数据扩充(augmentation)
对于CV应用,一般来说数据越多,网络性能越好。对于其它应用可能不一定,但是对计算机视觉,数据量是一个重要的因素。数据扩充就是对原有数据进行处理以获得更多的数据
常用的方法:mirror/random crop 其它几个可能比较复杂就比较少用
第二种方法:改变颜色。有一种方法是PCA(主成分分析),根据原有的颜色比例进行调整,使得修改后的颜色和原来一致
data augmentation(增强)的实现
一般是用一个线程从硬盘加载数据进行修改,再把这些数据传给其它的线程进行训练。这样数据处理与网络训练可以实现并行
超参数:颜色要改变多少,裁剪什么位置等
8. 计算机视觉现状
用于竞赛的tips,一般不推荐用于真实应用上
原文地址:https://www.cnblogs.com/coolqiyu/p/8719746.html