ResNet 小白学习笔记

写在前面

直接看论文对我这个小白来说太不友好了,几次放弃 /(ㄒoㄒ)/~~ 。幸好找到了一个通俗易懂的视频:6.1 ResNet网络结构,BN以及迁移学习详解,以下笔记大部分基于视频内容,再补充了一些自己看视频、论文中的一些学习链接、资料哈。本博客只是一个学习笔记哈 ~

感谢视频作者:霹雳吧啦Wz。视频地址:https://www.bilibili.com/video/BV1T7411T7wa?from=search&seid=11955774727614251131

开始学习啦!

首先是论文的一些基本情况介绍:

网络的结构图:

网络中的亮点一:超深的网络结构

如果只是普通卷积层和池化层的堆叠,网络层数越多,效果越差。产生的原因:梯度消失 / 爆炸问题 和 退化问题

梯度消失:假设每一层的误差梯度都是一个<1 的数,那么在反向传播的过程中,每向前传播一层,都要乘以一个<1 的系数。那么当网络越来越深的时,乘上<1 的系数就越来越多,梯度越来越小,趋近于 0

梯度爆炸:假设每一层的误差梯度都是一个>1 的数,那么在反向传播的过程中,每向前传播一层,都要乘以一个1 的系数。那么当网络越来越深的时,乘上1 的系数就越来越多,梯度越来越

这两种现象如何解决

  • 数据标准化处理     
  • 权重初始化
  • BN(Batch Normalization)

退化问题:解决完梯度消失和爆炸的问题后,任然会存在层数深的效果不如层数浅的效果好

如何解决残差结构

(2020.10.22补充)为什么 ResNet 可以解决这种退化问题?

参考:https://blog.csdn.net/qq_32172681/article/details/100177636

网络中的亮点二:残差模块

正是因为有了残差结构,所以网络才能层数越多效果越好。

残差结构有两种,图的适用于网络层数较少的网络;图适用于网络层数较多的网络。

注意,因为有 element-wise 的矩阵相加操作,所以主分支的输出特征与 shortcut 的输入矩阵 shape 必须相同

左图\sigma\left (W * \sigma\left ( W*x \right ) + x \right )

右图:在残差结构的输入和输出加上了 1*1 的卷积层,主要用来降维升维的。右图输入的 channels 数为 256,经过第一个 1*1 卷积层后,降维为 64 个 channels(高、宽不变);再通过一个 3*3 的卷积层,channels 数不变;最后,经过一个 1*1 卷积层后,升维为 256 个 channels(高、宽不变)。所以出来后的高、宽、channels 数与输入一致(高宽为何一致?加了 zero-padding?待深入阅读源码及论文)

右图的参数比左图少。具体计算过程图中是假设左右两边输入都是 256 个 channels 来计算的。

计算过程可参考:http://www.mamicode.com/info-detail-3017678.html

为什么经过 conv3*3 层之后 feature map 的高宽不变?

解答:因为有 padding.

不同层数的 ResNet 网络结构图

补充:

1、各层 output size 的计算方法

图片来自:卷积与反卷积、步长(stride) 与重叠(overlap) 及 output 大小的计算

2、ResNet 的网络实现代码

https://github.com/BizhuWu/vision/blob/master/torchvision/models/resnet.py

3、ResNet 网络结构分析:

https://zhuanlan.zhihu.com/p/79378841

4、卷积层中的 dilation 参数:

https://www.cnblogs.com/wanghui-garcia/p/10775367.html

当遇上残差结构的输入输出尺寸不一致时,如 Con3_x 的第一个残差结构(输入是 【56,56,64】,输出是【28,28,128】),用 stride = 2 来解决。

注意:只有在 Conv3_x、Conv4_x 和 Conv5_x 中的第一个残差结构(即 Conv3_1、Conv4_1 和 Conv5_1)才使用右边的虚线结构。其他残差结构都使用左边的实线结构。

细节为什么 Conv2_x 的第一个残差结构不用虚线结构呢?

刚好 18 和 24 层的 ResNet 在经过 3*3 的 max pooling 后,输出的 shape 刚好满足 Conv2_x 的第一个残差结构需要的输入 shape。

50、101、152 层的 ResNet 网络结构中 Conv2_x 的第一个残差结构就需要用虚线结构!但与 Conv3_x、Conv4_x、Conv5_x 的第一个残差(虚线)结构也有不同的地方:Conv2_x 的第一个残差结构只调整特征矩阵的 channels 数目,高和宽不变。

网络中的亮点三:使用 BN 加速训练(丢弃 dropout)

搬运 blog 地址:https://blog.csdn.net/qq_37541097/article/details/104434557

笔记:

1、通过 BN 可以加速网络的收敛提升准确率

2、BN 的目的就是使 feature map 满足均值为 0,方差为 1 的分布规律。

3、计算一个 batch 里所有数据某个 channels(x_{i}的均值、方差;再对这个 batch 里所有数据的这个 channels(x_{i}进行标准化处理。

4、训练时,需要将 training 参数设置为 True验证时将 training 参数设置为 False。在 PyTorch 中可通过创建模型的model.train() 和 model.eval() 方法控制。

5、Batch Size 尽可能设置大一些,越大越接近整个训练集的 mean 和 variance。

6、BN 层放在 卷积层 和 激活层 之间,并且卷积层不要使用偏置 bias

猜你喜欢

转载自blog.csdn.net/qq_36627158/article/details/108481279