Lecture 9 CNN Architectures
参见: https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_83
一, LeNet-5:
神经网络的第一个实例, 用于识别邮票上的手写数字, 使用步长为 1, 大小为 5*5 的卷积核, 对第一层进行操作, 然后进行池化, 通过几层卷积和池化, 在网络的最后还有一些全连接层. LeNet 在数据识别领域取得了成功.
二, AlexNet:
Alexnet 是 2012 年 ImageNet 中胜出的模型, 将错误率从 25.8% 降低至 16.4%.
1. 网络结构:
- [227x227x3] INPUT
- [55x55x96] CONV1: 96 11x11 filters at stride 4, pad 0
- [27x27x96] MAX POOL1: 3x3 filters at stride 2
- [27x27x96] NORM1: Normalization layer
- [27x27x256] CONV2: 256 5x5 filters at stride 1, pad 2
- [13x13x256] MAX POOL2: 3x3 filters at stride 2
- [13x13x256] NORM2: Normalization layer
- [13x13x384] CONV3: 384 3x3 filters at stride 1, pad 1
- [13x13x384] CONV4: 384 3x3 filters at stride 1, pad 1
- [13x13x256] CONV5: 256 3x3 filters at stride 1, pad 1
- [6x6x256] MAX POOL3: 3x3 filters at stride 2
[4096] FC6: 4096 neurons
[4096] FC7: 4096 neurons
[1000] FC8: 1000 neurons (class scores)
FC8 与 softmax 层相连, 进行 1000 个类别的 ImageNet 的图像分类.
2. 关于第一层形状和参数数量的计算(number of parameters)
output_size = (input_size-filter_size)/stride +1
parameters_num = filter_size*filter_number
比较有趣的是, 池化层参数数量为零. 因为它只对参数做了较少操作, 只是观察卷积层已有的参数, 然后取了最大值.
3.AlexNet 网络特点
- First use of ReLU;
- Used Norm layers (not common anymore);
- Heavy data augmentation;
- Dropout 0.5;
- Batch size 128;
- SGD Momentum 0.9;
- Learning rate 1e-2, reduced by 10 manually when val accuracy plateaus;
- L2 weight decay 5e-4(正则化的权重衰减);
- 7 CNN ensemble: 18.2% -> 15.4%(模型集成, 取平均).
由于当时所使用 GPU 的显存不够存放这么多参数, 因此从第一个卷积层开始将参数分为两组, 在两个 GPU 中训练.
三, ZFNet:
ZFNet 是 2013 年 ImageNet 获胜的模型, 在超参数上对 AlexNet 进行了改进.
ZFNet 网络特点
ZFNet 框架大体与 AlexNet 一致. 它们具有相同的层数, 基本结构; 在步长上有一点改进, 卷积核数量上也略有不同.
四, VGGNet
VGGNet 和 GoogleNet 是 14 年胜出的模型, 它们与之前的网络最大的不同之处在于拥有了更深层的网络, 分别是 19 层, 22 层. GoogleNet 与 VGGNet 很相近, 实际上是 VGGNet 的一个本地化的改进, 两者的鲁棒性都很好.
VGG16 网络详细信息:
- INPUT: [224x224x3] memory: 224x224x3=150K params: 0
- CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x3)x64 = 1,728
- CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x64)x64 = 36,864
- POOL2: [112x112x64] memory: 112x112x64=800K params: 0
- CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x64)x128 = 73,728
- CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x128)x128 = 147,456
- POOL2: [56x56x128] memory: 56x56x128=400K params: 0
- CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x128)x256 = 294,912
- CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824
- CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824
- POOL2: [28x28x256] memory: 28x28x256=200K params: 0
- CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x256)x512 = 1,179,648
- CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296
- CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296
- POOL2: [14x14x512] memory: 14x14x512=100K params: 0
- CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
- CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
- CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
- POOL2: [7x7x512] memory: 7x7x512=25K params: 0
- FC: [1x1x4096] memory: 4096 params: 7x7x512x4096 = 102,760,448
- FC: [1x1x4096] memory: 4096 params: 4096x4096 = 16,777,216
- FC: [1x1x1000] memory: 1000 params: 4096x1000 = 4,096,000
- TOTAL memory: 24M * 4 bytes ~= 96MB/image (only forward) (每个数字占用四字节内存)
- TOTAL params : 138M parameters.
前向传播占用的总内存约为每张图像 96MB, 算入反向传播的话加倍即可.
VGGNet 网络特点:
更小的 filters, 更深的网络;
Only 3x3 CONV stride 1, pad 1 and 2x2 MAX POOL stride 2;
这种卷积核已经是最小的卷积核了, 网络只关注相邻的像素. 整个网络保持这种小卷积核的结构, 并进行下采样, 简洁而优雅, 获得了 ImageNet 最好的 7.3 的错误率.
为什么使用小的卷积核? 当使用小卷积核时, 3 个 3x3 的卷积层和 1 个 7x7 的卷积层拥有同样有效的感受野, 但是小卷积核可以让我们尝试更深层的网络和更多的卷积核, 更非线性化, 最终的效果比大卷积核的效果要好, 且其参数数量更少, 3x(3x3)<7x7.
倒数第二层 FC(FC7,1000 个, 即类别层之前)的 hidden number=4096 被验证已经能够很好地进行特征表达, 可以用于在其他数据中提取特征, 并有比较好的泛化性能;
作者先训练了一个 11 层的网络, 使其收敛, 之后将其扩展到 16/19 层, 以此来解决深层网络收敛困难的问题(Batch Normalization 提出后就不需要这种操作了);
五, GoogleNet:
1.GoogleNet 网络特点:
l 22 层网络;
l 没有 FC 层, 因此节省了大量参数, 仅有 5million, 比 AlexNet 少了 12 倍;
l 为提高计算效率引入了 "inception" module 和 "bottleneck" 的概念;
l 网络有两个辅助输出 (Auxiliary classification outputs) 用于向低层的网络注入额外的梯度, 以此解决网络收敛困难的问题(Batch Normalization 提出后就不需要这种操作了);
2."inception" module
可以将网络看成是由局部网络拓扑 ("inception" module) 堆叠而成. 对进入相同层的相同输入并行应用不同类别的滤波操作. 我们将来自前面层的输入进行不同的卷积操作, 池化操作, 从而得到不同的输出, 最后需要将所有输出在深度层面上连接到一起. 计算与串联方式如下图所示:
我们通过 inception 操作在保持形状不变的情况下扩充了深度. 为什么在经过不同的滤波器后我们总是能得到相同的尺寸? 为了让输出尺寸和输入尺寸保持一致, 我们使用的方法是零填充(zero padding). 另外, 输入中的 256 是上一层中输入的深度.
池化层在这个问题中也参与了运算, 它保留了模型的深度, 因此在每一层深度只能增加.
另外通过计算我们可以发现, 卷积层的参数数量或者操作数量达到了 854M, 计算量极大.
3."blottleneck"(瓶颈层):
使用 "inception" module 后随之而来的问题就是:
l 单层的参数就达到 854M 个, 计算量极大;
l 且数据经过每一个 "inception" module 后深度都会增加(光池化层得到输出数据的尺寸就已经与原数据相同).
为解决上述问题, 构建了称之为 "bottleneck" 的 1x1 卷积层以减少特征深度(如下图所示):
改进后的 "inception" module 如下图所示:
Bottleneck 的目的是在卷积运算之前降低特征图的维度. 我们运用之前提到过的 1*1 卷积核, 它能够保持形状不变, 减小深度, 从而降低特征图的维度.
对于 Bottleneck 减小运算量的具体计算: 对于相同的输入大小 28*28*256, 我们将计算量减少到了 358M.
用 1*1 卷积核是否会导致一些信息丢失? 结果可能会有一些信息丢失, 但这样的效果更好, 对于处理计算复杂性这一点来说.
4.Full GoogleNet Architecture:
Stem Network 更像我们之前见过的正常的 CNN 结构.
我们将初始模块堆叠在一起
在堆栈的顶部有分类输出. 全连接层已经被移除, 没有 FC 工作效果依然很好, 还节省了很多参数.
5.Auxiliary classification outputs:
GoogleNet 同时拥有两个辅助输出, 它们是使用 Softmax 函数的一个带有平均池化的小网络, 具有平均池化, 1*1 卷积, FC*2,Softmax 分类的结构(相当于我们提前进行了分类输出), 可以对前面几个层进行更多的梯度训练. 当网络深度很深的时候, 一些梯度信号会最小化并且丢失了前面几层的梯度信号, 该方法能在一定程度上解决梯度消失的问题.
五, ResNet:
1.ResNet 网络特点:
l 152 层;
l 利用残差层实现优化;
l 网络由残差盒堆叠而成(每一个残差盒包含两个 3x3 CONV);
l 如果将残差盒中的所有权重置零, 那么残差盒的输出与输入就是相等的, 因此, 在某种层度上, 这个模型是相对容易去训练的, 并不需要添加额外的层;
l 神经网络中添加 L2 正则化的作用是迫使网络中的所有参数趋近于 0, 其他网络结构 (如 CONV) 参数趋于 0 不太说得通. 但在残差网络中, 如果所有参数趋于 0, 那就是促使模型不再使用他不需要的层, 因为它只趋使残差盒趋向同一性, 也就不需要进行分类;
l 残差连接在反向传播时, 为梯度提供了一个超级 "高速通道"(梯度经过残差盒的加法门分流然后汇总), 这使得网络训练更加容易(DenseNet 和 FractalNet 也有类似的梯度直传式的连接);
l 周期性的, 会使用两倍数量的 filters, 用 stride 2 CONV 进行下采样(所有维度 / 2);
l 网络起始处有一个额外的 CONV;
l 没有额外的 FC;
l 只有一个全局的 AVE POOL;
l 每一个 CONV 后都带有一个 BN;
l 用一个额外的带尺度因子的 Xavier/2 去初始化;
l 初始学习率为 0.1, 当 Validation error 停滞时, 将其缩小十倍;
- l Mini-batch size = 256;
- l Weight decay = 1e-5.
2. 残差盒(Residual block):
当我们在普通卷积神经网络 [1] 上堆叠越来越多的层时到底会发生什么? 我们以 VGG 或者其他的一般网络为例, 我们能仅仅通过扩展更多的层来得到更好的效果吗? 答案是不能.
由上图实验结果可知, 56 层网络的训练误差和测试误差都高于 20 层的网络. 按理说. 56 层的 NN 拥有很多参数和更深的层数, 应该会更早地达到过拟合, 从而拥有更低的训练误差和更高的测试误差. 但是实验表明 56 层的 NN 的训练误差比 20 层的 NN 更高了.
ResNet 的作者假设: 这是一个优化问题, 层深的模型更难优化. 于是, 作者提出了残差网络的概念, 其与常规网络的区别如下图所示:
Residual block 使这些网络层拟合的是残差映射 H(x)-x 而不是直接映射 H(x). 某种意义上可以看成是一种对输入的修正. 之前我们学习的是 H(x), 现在我们把最终的表达分解为 F(x)+x, 从而只需学习 F(x),F(x)就是我们所说的残差. 通常来说, 网络的层与层之间实际上相差不大的, 一个恒等映射 (x 到 x 本身) 加上很小的? x(若恒等映射是最好的, 只需将? x 置零)的学习过程更容易实现.
与 GoogleNet 类似, 如果网络层数较多的话, ResNet 的残差盒可以使用 "bottleneck" 来加速计算(如下图所示).
六, 扩展知识:
1.Network in Network(NiN):
每个卷积层中都有一个完全连接的 MLP(micronetwork), 以计算局部图像块的更多抽象特征. 这个模型是 GoogleNet 和 ResNet 模型 "bottleneck" 的灵感来源.
2.Identity Mappings in Deep Residual Networks:
在 ResNet 的基础上进行修改, 新的结构能够实现一种更直接的路径用于在整个网络中传播信息(将激活层移动到残差映射路径中).
3.Wide Residual Networks:
作者认为残差量是一个十分重要的因素而不是深度. 使用了更宽的残差模块(FxK filters 而不是 F filters in each layer), 宽网络的另一个优点是便于使用并行计算. 本文旨在比较网络的宽度, 深度和残差连接所做出的贡献.
4.ResNeXt:
通过多条平行路径增加残差盒宽度, 这些分支总和被称为 "cardinality", 思想类似于 "inception"module.
5.Deep Networks with Stochastic Depth:
动机是在训练过程中通过短网络减少消失梯度和训练时间. 该思想类似于 Dropout, 只不过这里是沿网络深度方向的 dropout. 方法是在每次训练中随机 drop 某层子集(即 ResNet 中? x=0, 该层为恒等映射), 在测试时使用完整的训练好的网络.
6.FractalNet:
作者认为引入残差可能不是必须的, 关键在于有效地从浅层网络转型为深层网络. 因此他使用了上图所示这种分型结构, 各层都以分形的形式存在, 因此同时存在浅层和深层路径到大输出值. 他们通过抛弃子路径的方式训练, 类似于 dropout, 测试时使用整个分形网络.
7.DenseNet:
密集连接卷积神经网络. 每个 Dense block 中每层都与其后的所有层以前馈的形式连接, 因此在这个 Dense block 内, 你对其的输入也是对所有其他各层的输入, 你会计算每一个卷积输出, 这些输出与其后的所有层连接, 所有这些值集中起来, 共同作为卷积层的输入. 这一方法能缓解梯度消失的问题, 加强特征图的传递, 鼓励特征的再利用.
8.SqueezeNet:
关注于构建高效网络, 压缩网络的大小. 由一个个 fire 模块组成, 每个 fire 模块都含有一个 squeeze 层, 其由许多 1x1 的 filters 组成. 接着, 它再传递给一个扩大层含有一些 1x1 和 3x3 的 filters. 参数只有 AlexNet 的 1/50, 性能相似.
[1] plain convolutional neural network 专指不带残差功能的卷积神经网络.
来源: http://www.bubuko.com/infodetail-2927250.html