Resnet50详解与实践 resnet网络结构详解

什么是ResNet , 本项目给大家介绍残差网络ResNet 。
ResNet是一种残差网络 , 咱们可以先简单看一下ResNet的结构 , 再对它的结构进行详细介绍 。

Resnet50详解与实践 resnet网络结构详解


从图可以看出 , 残差网络是由多个结构类似的块堆叠起来的 , 这样的块是残差网络的基本单元(称为残差块) , ResNet是由多个这样的残差块堆叠起来的 。
残差块长这样:
Resnet50详解与实践 resnet网络结构详解


【Resnet50详解与实践 resnet网络结构详解】那么可能会有小伙伴疑问 , 干嘛非要用残差块来构建这么一个深层网络呢?干嘛不直接用卷积层对网络进行一个堆叠呢?
为什么要引入ResNet?我们知道 , 网络越深 , 咱们能获取的信息越多 , 而且特征也越丰富 。但是根据实验表明 , 随着网络的加深 , 优化效果反而越差 , 测试数据和训练数据的准确率反而降低了 。这是由于网络的加深会造成梯度爆炸和梯度消失的问题 。
Resnet50详解与实践 resnet网络结构详解


网络加深时测试错误率和训练错误率显示
目前针对这种现象已经有了解决的方法:对输入数据和中间层的数据进行归一化操作 , 这种方法可以保证网络在反向传播中采用随机梯度下降(SGD) , 从而让网络达到收敛 。但是 , 这个方法仅对几十层的网络有用 , 当网络再往深处走的时候 , 这种方法就无用武之地了 。
为了让更深的网络也能训练出好的效果 , 何凯明大神提出了一个新的网络结构——ResNet 。这个网络结构的想法主要源于VLAD(残差的想法来源)和Highway Network(跳跃连接的想法来源) 。
ResNet详细解说再放一遍ResNet结构图 。要知道咱们要介绍的核心就是这个图啦!(ResNet block有两种 , 一种两层结构 , 一种三层结构)
两种ResNet block(代码给出了两种残差块以供选择)
咱们要求解的映射为:H(x)
现在咱们将这个问题转换为求解网络的残差映射函数 , 也就是F(x) , 其中F(x) = H(x)-x 。
Resnet50详解与实践 resnet网络结构详解


残差:观测值与输入值之间的差 。
这里H(x)就是观测值 , x就是输入值(也就是上一层ResNet输出的特征映射) 。
我们一般称x为identity Function , 它是一个跳跃连接;称F(x)为残差映射ResNet Function 。
那么咱们要求解的问题变成了H(x) = F(x)+x 。
有小伙伴可能会疑惑 , 咱们干嘛非要经过F(x)之后再求解H(x)啊?X的跳跃连接有什么好处吗?
因为如果是采用一般的卷积神经网络的化 , 原先咱们要求解的是H(x) = F(x)这个值对不?ResNet相当于将学习目标改变了 , 不再是学习一个完整的输出H(x) , 只是输出和输入的差别H(x)-x , 即残差 。学习一个微小的波动F(x)不比学习一个整个x更容易吗?X的跳跃连接除了让网络的学习有了基础 , 在梯度反向传播时也能更直接的传到前面的层去 。
残差块
残差块通过跳跃连接shortcut connection实现 , 通过shortcut将这个block的输入和输出进行一个逐点element-wise的加叠 , 这个简单的加法并不会给网络增加额外的参数和计算量 , 同时却可以大大增加模型的训练速度、提高训练效果 , 并且当模型的层数加深时 , 这个简单的结构能够很好的解决退化问题 。

推荐阅读