一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解

前言

继续学习霹雳大神的神经网络讲解视频

更新不易,希望大家可以去看原视频支持up主霹雳吧啦Wz

ResNet网络结构,BN以及迁移学习详解
使用pytorch搭建ResNet并基于迁移学习训练
本博文记载的是基于Pytorch框架的ResNet网络

ResNet网络结构详解与模型的搭建

简单介绍ResNet网络

ResNet在2015年由微软实验室提出,斩获当年ImageNet竞赛中
分类任务第一名,目标检测第一名。获得COCO数据集中目标
检测第一名,图像分割第一名。
网络亮点:

  1. 超深的网络结构(突破1000层)
  2. 提出residual(残差)模块
  3. 使用Batch Normalization(标准化处理)加速训练(丢弃dropout)

模型结构

34层残差结构的模型结构图
一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第1张图片

结构分析

在34层的resnet网络当中
一个卷积层
一个池化层
一系列的残差结构
平均下采样操作
最后是全连接层

//结构简单,通过堆叠残差网络组成

不断的堆叠层数可行嘛?
一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第2张图片
一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第3张图片
20层的错误率还小于56层的错误率

这是由于:

  • 梯度消失或梯度爆炸
    随着我们网络的不断加深,梯度消失或梯度爆炸的现象会越来越明显。假设我们的误差梯度是一个小于1的数,每向前传播一层,都要乘以一个小于1的误差梯度。当我们的网络越来越深,所需要乘以的小于1的数越多,所以就越趋近于零,这就是梯度消失现象。
    假设我们的误差梯度大于1,每向前传播一层,都要乘以一个大于1的误差梯度。当我们的网络越来越深,所需要乘以的大于1的数越多,所以就越来越大,这就是梯度爆炸现象。
    解决办法:对数据进行标准化处理、还有权重初始化,或者是BN初始化处理。

  • 退化问题(degradation problem)
    通过残差结果可以解决退化问题

经过改进后:

一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第4张图片

residual结构

一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第5张图片

  • 左边是主要是针对网络层数较少使用的残差结构(34层残差网络结构)

    本来的路线是->通过两个3x3的卷积核的到我们的结果。

    右边有一个弧线,直接从我们的输入连接到输出层,且有一个+号:意思是将我们的输入与经过两个3x3的卷积层处理后得到的特征矩阵相加,相加后再经过relu激活函数。
    这里注意:我们的主分支特征矩阵的高宽与测分支(shortcut)特征矩阵的高宽(shape)以及层数channel64是相同的,这样我们保证两个特征矩阵在相同的维度上进行相加。

  • 右边是主要是针对网络层数较多使用的残差结构(50/101/152层残差网络结构)
    通过1x1卷积核->3x3卷积核->1x1卷积核

    在这里1x1的卷积核是用来降维还有升维的。 这里可以看到从256层降低到64层,然后从64升维到256层,这样我们保证两个特征矩阵在相同的维度上进行相加。

右边与左边相比减少了多少参数的运算呢?
计算公式:widthheight输入的深度*卷积核的个数

假设输入一个特征矩阵是256x256x256
//这里注意将左图的64看成256计算即可

3x3x256x256+3x3x256x256=1179648
//使用256个卷积核,每个卷积核对应256层
1x1x256x64+3x3x64x64+1x1x64x256=69632
一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第6张图片
实线与虚线残差结构的区别?
//有待理解

Batch Normalization

Batch Normalization的目的是使我们的一批(Batch)
feature map满足均值为0,方差为1的分布规律。

一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第7张图片
在正向传播过程中统计得到
在这里插入图片描述

在反向传播过程中训练得到
一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第8张图片
具体理解:Batch Normalization详解以及pytorch实验

迁移学习

使用迁移学习的优势:

  1. 能够快速的训练出一个理想的结果
  2. 当数据集较小时也能训练出理想的效果

注意:使用别人预训练模型参数时,要注意别人的预处理方式。

一位深度学习小萌新的学渣笔记(五)ResNet网络介绍及代码详解_第9张图片
常见的迁移学习方式:

  1. 载入权重后训练所有参数
  2. 载入权重后只训练最后几层参数
  3. 载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层

注意:最后一层无法载入预训练模型参数

有待更新…

model.py代码解读

定义Inception结构

定义辅助分类器

定义我们的GoogLeNet网络

train.py

与AlexNet不同的两点

predict.py

你可能感兴趣的:(算法,深度学习,深度学习,神经网络,卷积)