1. AlexNet
Tips:
- Trained on GTX 580 GPU with only 3 GB of memory.Network spread across 2 GPUs, half the neurons (feature maps) on each
GPU.所以在CONV1中分为两部分,每部分输出大小为55X55X48! - CONV1, CONV2, CONV4, CONV5: Connections only with feature maps on same GPU
- CONV3, FC6, FC7, FC8: Connections with all feature maps in
preceding layer, communication across GPUs - heavy data augmentation:
a. 增大训练样本:通过对于图像的变换实现了对于数据集合的enlarge。首先对于输入的图像(size 256*256)随机提取224*224的图像集合,并对他们做一个horizontal reflections。变换后图像和原图像相差了32个像素,因此主体部分应该都包含在训练集合中,相当于在位置这个维度上丰富了训练数据。对horizontal reflections来说,相当于相机在主轴方向做了镜像,丰富了反方向的图像。数据集合增大了2048倍,直接结果就是降低了overfitting同时降低了网络结构设计的复杂层度。
在测试阶段,取每一个测试样本四个角以及中间区域,一共5个patch然后再镜像后得到10个样本输入到网络中,最后将10个softmax输出平均后作为最后的输出。
b.使用PCA对于训练数据进行增强:对于每一个RGB图像进行一个PCA的变换,完成去噪功能,同时为了保证图像的多样性,在eigenvalue上加了一个随机的尺度因子,每一轮重新生成一个尺度因子,这样保证了同一副图像中在显著特征上有一定范围的变换,降低了overfitting的概率。 - Norm layers:
更常用的是Local Response Normalization:
使用ReLU f(x)=max(0,x)后,你会发现激活函数之后的值没有了tanh,sigmoid函数那样有一个值域区间,所以一般在ReLU之后会做一个normalization,LRU就是其中一种方法,在神经科学中有个概念叫“Lateral inhibition”,讲的是活跃的神经元对它周边神经元的影响。
2. ZFNet
3. VGGNet
Tips:
- 用更小的filters的原因是可以大大减少参数的数量,并通过增加depth,达到与较大filters相同的效果(从参考的邻域点考虑Stack of three 3x3 conv (stride 1) layers has same effective receptive field as
one 7x7 conv layer)! - No Local Response Normalisation (LRN)
VGGNet消耗资源表:
4. GoogLeNet
GoogLeNet架构:
Tips:
“Inception module”: design a good local network topology (network within a network) and then stack these modules on top of each other
初始的Inception module及其存在的问题:
Solution: “bottleneck” layers that use 1x1 convolutions to reduce feature depth:
Tips:
Add 1x1 CONV with 32 filters, preserves spatial dimensions, reduces depth! Projects depth to lower dimension (combination of feature maps).
改进的Inception module:
Full GoogLeNet architecture:
Auxiliary classification outputs可以缓解深度过深导致权重梯度过小而无法优化的现象!
5. ResNet
受到深度的意义的驱使,出现了这样一个问题:是不是更多的堆叠层就一定能学习出更好的网络?这个问题的一大障碍就是臭名昭著的梯度消失/爆炸问题,它从一开始就阻碍了收敛,然而梯度消失/爆炸的问题,很大程度上可以通过标准的初始化和正则化层来基本解决,确保几十层的网络能够收敛(用SGD+反向传播)。
然而当开始考虑更深层的网络的收敛问题时,退化问题就暴露了:随着神经网络深度的增加,精确度开始饱和(这是不足为奇的),然后会迅速的变差。出人意料的,这样一种退化,并不是过拟合导致的,并且增加更多的层匹配深度模型,会导致更多的训练误差。如下图所示:
我们通过引入一个深度残差学习框架,解决了这个退化问题。我们不期望每一层能直接吻合一个映射,我们明确的让这些层去吻合残差映射。形式上看,就是用H(X)来表示最优解映射,但我们让堆叠的非线性层去拟合另一个映射F(X):=H(X) - X, 此时原最优解映射H(X)就可以改写成F(X)+X,我们假设残差映射跟原映射相比更容易被优化。极端情况下,如果一个映射是可优化的,那也会很容易将残差推至0,把残差推至0和把此映射逼近另一个非线性层相比要容易的多。
F(X)+X的公式可以通过在前馈网络中做一个“快捷连接”来实现 ,快捷连接跳过一个或多个层。在我们的用例中,快捷连接简单的执行自身映射,它们的输出被添加到叠加层的输出中。自身快捷连接既不会添加额外的参数也不会增加计算复杂度。整个网络依然可以用SGD+反向传播来做端到端的训练,并且可以很容易用大众框架来实现(比如Caffe)不用修改slover配置(slover是caffe中的核心slover.prototxt)
ResNet结构图:
ResNet结构特点:
更进一步的改进:
Training ResNet in practice:
- Batch Normalization after every CONV layer
- Xavier/2 initialization from He et al.
- SGD + Momentum (0.9)
- Learning rate: 0.1, divided by 10 when validation error plateaus
- Mini-batch size 256
- Weight decay of 1e-5
- No dropout used
各网络架构性能(准确率,耗时,占用内存)比较:
Tips:
- Inception-v4: Resnet + Inception!
- VGG: Highest memory, most operations
- GoogLeNet: most efficient
- AlexNet: Smaller compute, still memory heavy, lower accuracy
- ResNet: Moderate efficiency depending on model, highest accuracy
6. Other architectures
Network in Network (NiN):
Improving ResNets:
更宽的残差网络:
加入随机概念:
Fractal architecture with both shallow and deep paths to output:
Beyond ResNets
Efficient networks
Summary: CNN Architectures
- VGG, GoogLeNet, ResNet all in wide use, available in model zoos
- ResNet current best default
- Trend towards extremely deep networks
- Significant research centers around design of layer / skip connections and improving gradient flow
- Even more recent trend towards examining necessity of depth vs.
width and residual connections