ResNet-34

再34层的ResNet的结构简图当中:首先是卷积层,然后是池化层,有连接线的结构就是一个残差结构再这个34层的ResNet是由一系列的残差结构组成的。最后通过一个平均池化层以及一个全脸基层也就是输出层组成的。这个网络的结构十分简单,基本就是堆叠残差结构组成的。

ResNet结构的一些亮点:

  • 超深的网络结构(突破了1000层)
  • 提出residual模块
  • 使用BN加速训练

简单的堆叠卷积层和池化层行不行?

左边的图(论文当中),再堆叠在20层的网络结构的时候,模型的训练错误在1%-2%左右,但是当训练的层数增加到56层的时候,训练的错误在7%-8%。很明显通过卷积层和池化层的增加是不行的。

是什么原因在成训练的结果很差的呢?

在论文当中,作者提出的两个问题:随着网络层数的增加,梯度消失和梯度爆炸这个问题越来越明显。我们做一个假设,假设每一层的梯度误差是一个小于1的数,在反向传播的过程当中,没向前传播一次,都要乘上一个小于1的误差梯度。当网络越来月神的时候,乘上的小于1 的系数就越来越趋近于0.这样梯度越来越小,造成了梯度消失的情况。

反过来,梯度是一个大于1的数,在反向传播的过程中,每传播一次梯度就要乘上一个大于1 的数,当网络越来越深的时候,乘上大于1 的系数就无限大,梯度就越来越大,造成梯度爆炸的情况。

梯度消失和梯度爆炸的情况怎么解决呢?

通常是对数据进行标准化处理和权重初始化以及BN这些方法来解决。

在论文中,作者还提出的一个问题是退化问题。

在解决了梯度消失和梯度爆炸的情况,还是存在这层数的增加误差很大的情况,怎么解决文中所说的退化问题呢

提出了残差的结构,通过残差的结构就能解决退化问题,右图中的实线代表的是验证集的错误率,虚线代表的训练集的错误率,我们看验证集的错误率,随着层数的增加,错误率减小了,效果越好。

残差模块

提出的残差模块。正是因为提出了残差模块,可以搭建更深的网络。

左边的图主要是针对于网络层数较少(ResNet-34)的使用的残差结构,右边的图是针对层数较多的网络使用的残差结构。

先看左边的结构,主线是输入特征举着通过两个3×3 的卷积层得到结果,在这个主线的右边是有一个从输入到输出的结构,整个的结构的意思是在主线上经过一系列的卷积层之后得到的特征矩阵再与输入特征矩阵进行一个相加的操作(两个分支的矩阵在相同的维度上做的相加的操作),相加之后通过激活函数输出。注意:主分支与shortcut的输出特征矩阵shape必须是相同的。

右边的这个结构,与左边结构的不同是在输入和输出上加了一个1×1的卷积层,这两个1×1的卷积层的作用是用来做什么的呢?

在图中可以知道这个输入矩阵的深度是256-d,通过第一层的卷积层(卷积核是64 )之后,这个输入矩阵的长和宽时不变的,但是通道数由原来的256变成了64.(第一层的卷积层是起到将维的作用)。到第三层的时候通道数变成了256 ,此时输出和输入的维数是一样的,此时就可以进行相加。

左右两个不同的残差结构对比节省了多少的参数呢?

左边的结构是1179648 ,右边结构的参数是69632,这样看来,使用的残差结构越多,使用的参数就越少。

文章中给的图:

在34层的残差结构上由的层之间用的是实线,有的层用的是虚线。这有什么不同?

   

首先采用实线的部分输入矩阵和输出矩阵的shape是一样的,所以能够直接进行相加,但是虚线所连接的输入和输出矩阵的shape是不一样的。右边的两张图进行一个对比可以得到:第一个3×3 128的卷积层的步长是2,从一开始输入矩阵的长是56 到输出的矩阵的长是28,这样是缩减了一半。通过卷积核128进行一个增加维数的操作,使得输出矩阵的深度是128。在shortcut的部分是添加了一个128 的卷积核,步长也是2.通过增加这个shortcut的卷积核使得输入矩阵的长和宽也缩减了原来的一半。这样的操作就保证了主线的输出矩阵和shortcut的输出矩阵是一样的。

输入矩阵的维数是[56,56,256],输出矩阵的维数是[28,28,512],这样的情况对应的是层数为50,101,152的。这是如何让进行操作的呢?

对于第一个卷积层的不尝试1 ,知识起到一个将维的作用。将输入的矩阵的深度变成了128,并没哟改变特征矩阵的高和宽,通过第二层的3×3的卷积层,输出卷积核的长和宽就缩减为原来的一半,变成28×28×128.再通过最后1×1 的卷积层来增加了深度,从原来的256变成了512

所以虚线的作用是将输入矩阵的 长宽高进行一个变化。对于实线是没有变化的。所以对于conv3,conv4,conv5的第一层值得是虚线的结构。第一层必须将上一层的特征矩阵长宽高调整为当前层所需要的长宽高。

BN

使用BN 加速训练,使用了这种方法就不必在使用Dropout的方法了。BN的目的是使我们的batch数据所对应的特征矩阵的均值使0,方差是1 的分布规律。通过这个方法加速网洛的训练提升网路i的准确率。

在之前搭建网络的过程中,是先对图像数据进行一个预处理。满足某一分布规律,这样的话就能加速网络的训练,图像经过卷积层1得到的特征层不一定满足所期望的某一分布。所以BN 这个方法就是调整特征层(每一层的特征层)的分布满足均值为0,方差为1 的分布。

注意:BN 是调整输入一批数据的feature map的每一层的分布,让每一层的feature map都能满足均值为0,方差为1 的分布规律。并不是调整某一个的feature map所对应的分布。

进行标准化处理的公式, 首先计算每一个通道所对应的均值,这里所说的每一个通道这是一批数据同一个通道的所有数据的均值和方差。第三式是标准化所得到的初值。第四个式子是进一步的调整是调整数据方差大小,是用来调整数据的均值,这两个学习参数通过反向传播学习得到的。均值和方差是通过一批批的计算统计得到的。

接下来将的实例:

假设batch的size为2 ,输入两张图片所得到的两个特征矩阵:feature1 和feature2.现在对这两个特征矩阵进行BN处理的话,首先计算均值和方差,对于channel 1是计算整个batch的channel为1 的方差和均值。同理,channel 2一样。所求的均值和方差是向量而不是一个数值。向量维度和channel的深度是一样的。1对应的就是channe1的均值,0.5对应的就是channel2 的均值。通过BN公式就得到BN之后的特征矩阵的值。

残差网络—ResNet相关推荐

  1. (pytorch-深度学习)实现残差网络(ResNet)

    实现残差网络(ResNet) 我们一般认为,增加神经网络模型的层数,充分训练后的模型理论上能更有效地降低训练误差. 理论上,原模型解的空间只是新模型解的空间的子空间.也就是说,如果我们能将新添加的层训 ...

  2. dlibdotnet 人脸相似度源代码_使用dlib中的深度残差网络(ResNet)实现实时人脸识别 - supersayajin - 博客园...

    opencv中提供的基于haar特征级联进行人脸检测的方法效果非常不好,本文使用dlib中提供的人脸检测方法(使用HOG特征或卷积神经网方法),并使用提供的深度残差网络(ResNet)实现实时人脸识别 ...

  3. 残差网络ResNet

    文章目录 ResNet模型 两个注意点 关于x 关于残差单元 核心实验 原因分析 ResNet的效果 题外话 ResNet是由何凯明在论文Deep Residual Learning for Imag ...

  4. 对残差网络resnet shortcut的解释

    重读残差网络--resnet(对百度vd模型解读) 往事如yan 已于 2022-02-25 07:53:37 修改 652 收藏 4 分类专栏: AI基础 深度学习概念 文章标签: 网络 cnn p ...

  5. 深度残差网络RESNET

    一.残差神经网络--ResNet的综述 深度学习网络的深度对最后的分类和识别的效果有着很大的影响,所以正常想法就是能把网络设计的越深越好, 但是事实上却不是这样,常规的网络的堆叠(plain netw ...

  6. 深度学习目标检测 RCNN F-RCNN SPP yolo-v1 v2 v3 残差网络ResNet MobileNet SqueezeNet ShuffleNet

    深度学习目标检测--结构变化顺序是RCNN->SPP->Fast RCNN->Faster RCNN->YOLO->SSD->YOLO2->Mask RCNN ...

  7. 吴教授的CNN课堂:进阶 | 从LeNet到残差网络(ResNet)和Inception Net

    转载自:https://www.jianshu.com/p/841ac51c7961 第二周是关于卷积网络(CNN)进阶部分,学到挺多新东西.因为之前了解过CNN基础后,就大多在用RNN进行自然语言处 ...

  8. 何恺明编年史之深度残差网络ResNet

    文章目录 前言 一.提出ResNet原因 二.深度残差模块 1.数学理论基础 2.深度网络结构 三.Pytorch代码实现 四.总结 前言 图像分类是计算机视觉任务的基石,在目标监测.图像分割等任务中 ...

  9. 【深度学习】深度残差网络ResNet

    文章目录 1 残差网络ResNet 1.1要解决的问题 1.2 残差网络结构 1.3 捷径连接 1.4 总结 1 残差网络ResNet 1.1要解决的问题   在传统CNN架构中,如果我们简单堆叠CN ...

  10. TF2.0深度学习实战(七):手撕深度残差网络ResNet

    写在前面:大家好!我是[AI 菌],一枚爱弹吉他的程序员.我热爱AI.热爱分享.热爱开源! 这博客是我对学习的一点总结与记录.如果您也对 深度学习.机器视觉.算法.Python.C++ 感兴趣,可以关 ...

最新文章

  1. 备份一个万能网卡驱动
  2. 阿里云Redis多线程性能提升思路解析
  3. [转]解决STM32开启定时器时立即进入一次中断程序问题
  4. 致力推广Vim的那个程序员走了,Vim之父:我要把9.0版献给他
  5. .net core 项目文件结构浅析
  6. VC++6绘制GIS地图不同类型的点
  7. ElementUI中el-form实现表单重置以及将方法抽出为全局方法
  8. vue-cli 没有build如何配置_webpack4配置实现浏览器长期缓存
  9. tensorflow数据增强
  10. 关于vs2012、tfs2012、windows server 2008r2一些记录
  11. 静态页中利用AJAX.NET实现无刷新页面
  12. SSM框架中出现的几种注解的理解
  13. 修改远程桌面服务器里的密码
  14. 华为olt ma5680t常用命令详解
  15. Xshell6、Xftp6【官方免费版】下载
  16. Xshell和secureCRT
  17. 教你一键如何更换证件照底色?
  18. 流量计专用无线物联模块介绍
  19. edge浏览器怎么设置activex_Microsoft Edge拥抱HTML5和JavaScript,不再支持IE上的ActiveX技术...
  20. OpenCV手势识别-手掌特征提取

热门文章

  1. [源码和文档分享]基于VC++实现的中国象棋-双人象棋游戏
  2. 2021年电工(初级)考试资料及电工(初级)考试技巧
  3. [zz]P2P直播软件设计的技术原理和改进
  4. 利用VLMCSD部署本地KMS服务器(Windows + CentOS7)
  5. 【读书笔记】《暗时间》
  6. 一个div里面包含两个div让两个div垂直居中
  7. java公司年会抽奖流程图文件流_年会抽奖程序的一些总结
  8. CentOS 7 - Securing OpenSSH(一)
  9. 在html css中加粗显示,HTML和CSS实现字体加粗的三种方法
  10. Django搭建后台管理系统