AlexNet
卷积层输出大小和参数量的计算:
输出大小:由于输入是227x227x3,且第一个卷积层使用了96个步长为4的11x11的卷积核。
所以,输出的宽(高)= 1+(227-11)/4 = 55,输出通道数=卷积核个数=96。
综上,第一个卷积层的输出为55x55x96。
参数量:每个卷积核有11x11x3个参数,总共96个卷积核,所以第一个卷积层有11x11x3x96个参数。
池化层输出大小和参数量计算:
输出大小:池化层输入是55x55x96,使用步长为2的3x3卷积核。
输出宽(高)= 1+(55-3)/2 = 27,输出通道 = 输入通道 = 96。
所以,输出大小为:27x27x96。
参数量:池化层不需要参数。
左边是AlexNet构架,右边是一些细节(超参数、优化器、激活函数等):
由于当时机器运算能力的限制,这个网络是分成两部分分别在两个GPU上训练的,相当于分为两组的组卷积。当然在某些层中(CONV3, FC6, FC7, FC8),组与组之间是有联系的。
AlexNet是ImageNet Large Scale Visual Recognition Challenge (ILSVRC)比赛中首个基于CNN的赢家(2012年)。
2013年的赢家ZFNet只是更改了AlexNet的一些超参数,比如卷积核的大小,卷积核的个数。
VGG
VGG的特点是使用小卷积核(只用步长为1,padding为1的3x3卷积核和步长为2的2x2最大池化卷积核)+更深的网络(AlexNet的8层->16或19层)
Q:为什么用小卷积核?
A:小卷积核堆叠起来和大卷积核有相同的感受视野,与此同时,神经网络的层数更深,拥有更多的非线性能力,而且相对于大卷积核参数也更少。
VGG16的架构:
可以看到,内存主要花费在前面几个卷积层(保存数据用于反向传播),参数主要集中在后面的全连接层。
GoogleNet
GoogleNet的特点:以有效的计算实现更深的网络。
- 网络总共有22层
- 使用了Inception模块
- 没有全连接层(事实上只是减少了两个全连接层)
- 参数比AlexNet少12倍
inception结构的基本想法是对输入使用不同的卷积核(学习更多样的信息),然后把它们拼接起来。
但是这个结构有个问题:
计算量非常大,每一个inception结构有854M的操作(只算了乘法操作)。
而且通道数会不断增加:通过padding可以保持输出输出大小的宽和高,由于在输出的时候进行的是拼接,所以通道数肯定会增加(池化层会保持输出层通道数不变,再加上另外3个的通道数)。
这样,每经过一个inception结构通道数就会变得更多(宽和高不变),这就导致计算量进一步增加。
解决的办法是使用1x1的卷积,也就是bottleneck结构。
1x1的卷积能在维持宽和高的情况下减少(也可以增加)通道的维数。这样一来操作数就从845M减少到了358M。
GoogleNet的网络框架:
左边是输入,右边是输出,把中间大部分的卷积层换成了inception结构。
由于网络层数比较深,容易造成梯度消失(特别是在靠近输入层的地方),所以增加了两个额外的辅助输出,用于减缓底层的梯度消失。
ResNet
研究发现,单纯把卷积层堆叠起来时,更多的层数反而有更高的训练误差和测试误差,而且这不是过拟合导致的(过拟合的训练误差会比较低)。
何凯明他们提出了一个假设:这是由于较深的网络很难优化。
然后他们也提出了一个解决方案:
不直接学习输出H(x)了,转而学习F(x)=H(x)-x
ResNet的结构:
- 把残差结构堆叠起来
- 每个残差结构里有两个3x3的卷积层
- 周期性地把卷积核的数量变成原来的两倍,并周期性地使用步长为2(/2)的卷积来进行下采样
- 在开始添加额外的卷积层
- 只有一个全连接层用于输出
- 在全连接层前是全局平均池化
- 对于比较深的网络(50层以上),使用bottleneck增加计算效率
ResNet的一些细节
ResNet解决了优化问题,所以层数可以增加到152层。
它是所有(5个)2015年ILSVRC和COCO挑战的冠军,也是首个在图像分类方面表现的比人类更好的网络。
2016年的赢家使用了集成网络,集成了inception、inception-ResNet、ResNet、wide ResNet等模型
2017年是赢家是SENet
- 添加“特征校准”模块,自适应地调整特征的权重
- 输入(维度CxHxW)->全局平均池化(维度Cx1x1)->FC(维度C/16x1x1)->FC(维度Cx1x1),最后的Cx1x1是权重,乘以输入CxHxW,得到最终输出
其他网络
改进ResNet
Identity Mappings in Deep ResNet
- 为整个网络的信息传播提供更直接的路径(把激活层放到残差映射的路径中)
wide ResNet
- 认为残差网络比网络的深度更有效
- 使用F*k个卷积核代替F个卷积核
- 50层的wide ResNet比152层的ResNet效果更好
- 增加卷积核宽度比增加网络层深度更有效(可以进行并行计算)
ResNetXT
- 通过多个并行路径增加网络的宽度
- 并行路径上使用类似于inception的结构(也就是使用了1x1卷积)
其他想法
DenseNet
- 每一层以前馈方式连接到其他层的密集块
- 缓解梯度消失,加强特征传播,鼓励特征重用
- 50层的网络比152层的ResNet效果更好
轻量级神经网络
MobileNet
- 使用深度可分离卷积代替正常卷积
- 在维持准确率的情况下,网络更有效
- 后续工作:MobileNetv2、MobileNetv3、shuffleNet
神经网络结构搜索
NAS
- 控制器网络学习设计一个好的网络架构(输出设计网络的对应字符)
- 迭代
- 从搜索空间中采样一个网络架构
- 训练该架构获得奖励R(和准确率有关)
- 计算采样概率的梯度,用R来控制参数更新的尺度(增加好架构的采样概率,降低坏架构的采样概率)
- 将NAS应用到ImageNet这样大的数据集是很耗费计算量的
- 设计一个可灵活堆叠的模块作为搜索空间
- NASNet:使用NAS在较小的数据集CIFAR-10上找到最好的模块结构,然后迁移到ImageNet
- 后续工作: AmoebaNet 、ENAS
EfficientNet - 通过扩展宽度、深度和分辨率来增加网络容量,同时平衡准确性和效率
- 在给定计算能力(内存限制、FLOPS)的情况下寻找最优的复合比例因子集
- 使用智能启发式规则进行扩展
小结
要点:
-
AlexNet证明可以使用CNN训练计算机视觉模型
-
ZFNet、VGG证明大型网络效果更好
-
GoogleNet注重于使用更有效的1x1卷积和全局平均池化代替全连接层
-
ResNet展示了如何训练非常深的网络
- 仅受GPU和内存的限制
- 证明网络层数更多并不一定有更好的结果
-
ResNet之后CNN的效果已经超过人类,目标转向更有效的网络:MobileNet、ShuffleNet
-
NAS可以自动设计网络
-
在model zoo里有很多流行的模型可以直接使用
-
目前默认使用ResNet和SENet
-
网络变得越来越深了
-
网络架构的其他方面也在不断的进行研究和改进