Residual network I -- block and bottleneck
ResNet (Residual Neural Network)由何凯明等在15年提出,这里做个笔记,参考了TensorFlow 实战的6.4节。ResNet的结构能加速超深神经网络的训练,能有效避免过拟合,而且推广性非常好。
深度神经网络存在Degradation
的问题,即随着网络层数的增加,其准确率会从逐渐提升到饱和,进而下降。这一问题在我们近期的工作也出现了,我们在增加了一层全连接后,网络的准确率反而下降了。为了解决这一问题,ResNet提出了一种新的网络思路,即允许原始输入信息直接传输到后面的层中。假定某段网络的输入是,期望输出是,如果直接将传到输出作为初始结果,那么目标函数变为
如下图所示为一个ResNet的残差学习单元,即将学习目标从改为期望与输入的残差。这种结构也被称为shortcut
或skip connections
.

考虑到神经网络相当于对原始数据进行了压缩,存在信息损失的问题,而ResNet结构将部分输入信息直接传递到输出端,可以保留部分的信息。并且ResNet的训练误差会随着层数增加而逐渐减少,并且在测试集上也有很好的表现。
引自TensorFlow实战,在ResNet的第二篇论文Identity mapping in deep residual networks中,提出了ResNet V2。想对于ResNet V1, 将激活函数ReLU
改为了Identity mapping
,即y=x。同时,ResNet V2在每一层都使用了Batch Normalization,提升网络的范化能力。
ResNet的block的理解
在ResNet的实现中,包含多个block
,每个block
又由多个bottleneck
组成,称为残差学习单元,ResNet的残差运算即在每个bottleneck内实现。因为要获取输入与block输出的残差,每个bottleneck
虽然做了多次卷积和激活运算,但其输出的shape
应该保持不变,因此内部的卷积运算的stride
和padding
都有特殊的设置 (数学推导可以参考此文)。以ResNet-50的第二个block为例,假设该block内包含两个bottleneck单元,则有,
Bottleneck One
Layer | Input | Kernel | Stride | Padding | Output |
---|---|---|---|---|---|
Conv1,1 | 56x56x64 | 1x1x64 | 1 | SAME | 56x56x64 |
Conv1,2 | 56x56x64 | 3x3x64 | 1 | SAME | 56x56x64 |
Conv1,3 | 56x56x64 | 1x1x256 | 1 | SAME | 56x56x256 |
Bottleneck Two
Layer | Input | Kernel | Stride | Padding | Output |
---|---|---|---|---|---|
Conv2,1 | 56x56x256 | 1x1x64 | 1 | SAME | 56x56x64 |
Conv2,2 | 56x56x64 | 3x3x64 | 2 | SAME | 28x28x64 |
Conv2,3 | 28x28x64 | 1x1x256 | 1 | SAME | 28x28x256 |
注意Bottleneck Two
的Conv2,3
层的stride
为2,因此输出的尺度大小相当于做了factor为2的降采样,因此该bottleneck不做残差的运算,其输出直接作为下一个block的输入。
ResNet-V2相对于ResNet-V1增加了Batch Normalization
和L2
正则,如何在block中体现? 且听下回分解。