残差神经网络ResNet介绍
简介
- 神经网络层数比较高时,就很难被训练,容易出现梯度爆炸、梯度消失等问题。残差网络就是一种跳跃连接的网络,它通过将前面的激活值跳过中间的网络层而直接传到更后面的网络中,来避免梯度爆炸和梯度消失,训练更深的网络。
残差块
- 普通的神经网络层
一个神经网络在准确率已经达到饱和的情况下,增加网络层数可能会导致梯度爆炸和梯度消失的情况,导致准确率突然下降。
梯度爆炸:激活值会越来越大
梯度消失:激活值会越来越小
残差块
期望结果H(x)从F(x)变为F(x)+x通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,
也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
- 若F(x)与x维度相同,则直接相加,若维度不相同,可以使H(x)=F(x)+Wx,通过一层卷积来调整x的维度,使得能与F(x)相加
好处
缓解梯度爆炸
缓解梯度消失(梯度弥散)
在反向传播时,梯度由两部分组成,其中对x的直接映射梯度为1,另一部分是多层普通神经网络映射的梯度
这样即使普通神经网络的梯度已经为0,仍然还有一个1的存在,有效地缓解了梯度弥散的情况。
代码实现
当F(x)与x维度相同时
# 维度相同时的残差块 def identity_block(X, f, filters, stage, block):"""实现了上图中展示的残差块参数:X -- 要跳跃的激活值矩阵f -- 整型。指示卷积层的窗口大小filters -- 整型数组,指示残差块中的卷积层的过滤器的个数stage -- 整型。用来辅助给网络层取名。block -- 字符串。用来辅助给网络层取名。返回:X -- 残差块的最终输出矩阵"""# 取一些名字而已,无关紧要conv_name_base = 'res' + str(stage) + block + '_branch'bn_name_base = 'bn' + str(stage) + block + '_branch'# 获取每一个卷积层对应的过滤器的个数F1, F2, F3 = filters# 保存输入的激活值,以便后面跳插入到后面的网络层中X_shortcut = X# 主路中的第一组网络层,就是图4的第一组绿橙黄小方块X = Conv2D(filters=F1, kernel_size=(1, 1), strides=(1, 1), padding='valid', name=conv_name_base + '2a', kernel_initializer=glorot_uniform(seed=0))(X)X = BatchNormalization(axis=3, name=bn_name_base + '2a')(X)X = Activation('relu')(X)# 主路中的第二组网络层,就是上图的第二组绿橙黄小方块X = Conv2D(filters=F2, kernel_size=(f, f), strides=(1, 1), padding='same', name=conv_name_base + '2b', kernel_initializer=glorot_uniform(seed=0))(X)X = BatchNormalization(axis=3, name=bn_name_base + '2b')(X)X = Activation('relu')(X)# 主路中的第三组网络层,图4的第三组绿橙小方块X = Conv2D(filters=F3, kernel_size=(1, 1), strides=(1, 1), padding='valid', name=conv_name_base + '2c', kernel_initializer=glorot_uniform(seed=0))(X)X = BatchNormalization(axis=3, name=bn_name_base + '2c')(X)# 这一步就是实现小路的地方。其实就是简单的将前面层的激活值X_shortcut与第三组网络层的输出激活值合并在一起# 然后将合并的激活值向下传入到激活函数中,进入到后面的神经网络中去X = Add()([X, X_shortcut])X = Activation('relu')(X)return X
当F(x)与x维度不同时
# 实现上图中的残差块 def convolutional_block(X, f, filters, stage, block, s=2):conv_name_base = 'res' + str(stage) + block + '_branch'bn_name_base = 'bn' + str(stage) + block + '_branch'F1, F2, F3 = filtersX_shortcut = XX = Conv2D(filters=F1, kernel_size=(1, 1), strides=(s, s), padding='valid', name=conv_name_base + '2a', kernel_initializer=glorot_uniform(seed=0))(X)X = BatchNormalization(axis=3, name=bn_name_base + '2a')(X)X = Activation('relu')(X)X = Conv2D(filters=F2, kernel_size=(f, f), strides=(1, 1), padding='same', name=conv_name_base + '2b', kernel_initializer=glorot_uniform(seed=0))(X)X = BatchNormalization(axis=3, name=bn_name_base + '2b')(X)X = Activation('relu')(X)X = Conv2D(filters=F3, kernel_size=(1, 1), strides=(1, 1), padding='valid', name=conv_name_base + '2c', kernel_initializer=glorot_uniform(seed=0))(X)X = BatchNormalization(axis=3, name=bn_name_base + '2c')(X)# 在小路上面加上一个卷积层和一个BatchNormalization# 卷积层会改变X_shortcut的维度,这样一来,就能与X矩阵合并在一起了X_shortcut = Conv2D(filters=F3, kernel_size=(1, 1), strides=(s, s), padding='valid', name=conv_name_base + '1', kernel_initializer=glorot_uniform(seed=0))(X_shortcut)X_shortcut = BatchNormalization(axis=3, name=bn_name_base + '1')(X_shortcut)# 将变维后的X_shortcut与X合并在一起X = Add()([X, X_shortcut])X = Activation('relu')(X)return X
残差神经网络ResNet介绍相关推荐
- 【Pytorch(七)】基于 PyTorch 实现残差神经网络 ResNet
基于 PyTorch 实现残差神经网络 ResNet 文章目录 基于 PyTorch 实现残差神经网络 ResNet 0. 概述 1. 数据集介绍 1.1 数据集准备 1.2 分析分类难度:CIFAR ...
- 深度学习——残差神经网络ResNet在分别在Keras和tensorflow框架下的应用案例
原文链接:https://blog.csdn.net/loveliuzz/article/details/79117397 一.残差神经网络--ResNet的综述 深度学习网络的深度对最后的分类和识别 ...
- Pytorch实现残差神经网络(ResNet)
1. 残差块 输入X,经过两次次卷积,一次ReLU,得到F(X),在将X与F(X)相加,在经过一个ReLU,即为最后的结果.残差神经网络就是基于残差块的一个深度神经网络. 2. 代码 这篇博客理论涉及 ...
- 残差神经网络Resnet(MNIST数据集tensorflow实现)
简述: 残差神经网络(ResNet)主要是用于搭建深度的网络结构模型 (一)优势: 与传统的神经网络相比残差神经网络具有更好的深度网络构建能力,能避免因为网络层次过深而造成的梯度弥散和梯度爆炸. (二 ...
- 残差神经网络(ResNet)
残差神经网络的主要贡献是发现了退化现象,并针对退化现象发明了快捷连接(shortcut connection),极大的消除了深度过大的神经网络训练困难问题. 1.神经网络越深准确率越高 假设一个层数较 ...
- 残差神经网络 ResNet
上图为ResNet残差神经网络,目的是为了防止出现过优化的问题 比如上图中,已经达到了最优化的情况下,这时候已经最优状态了,在进行卷积会出现退化现象,所以这时候输出的H(x) = F(x) + x [ ...
- 深度学习笔记(三十五)残差神经网络ResNet
训练深层神经网络时,如果深度特别大,其实是很难训练下去的,因为会遇到梯度消失和梯度爆炸的问题.残差网络可以帮助我们更好地训练深层神经网络. 一.残差块 在神经网络的两层中,会执行如下运算过程(主路径) ...
- 全网最全的ResNet(残差神经网络)介绍
1.新的结构 提出背景: 该团队研究了VGGNet,给它最多为什么是19层提出了解释 左图为VGGNet在训练集上的损失,右图是在测试集上的,图像表明随着层数的加深,模型的泛化能力并没有提升,反而下降 ...
- 论文笔记:残差神经网络(ResNet v1)
ResNet v1 1.四个问题 要解决什么问题?/ 用了什么办法解决? 理论上来说,深层网络的效果至少不会比浅层网络差. 对于浅层网络A,深层网络B,假设B的前面部分与A完全相同,后面部分都是恒等映 ...
最新文章
- echarts - 条形图grid设置距离绘图区域的距离
- Android 中文API(86)——ResourceCursorAdapter
- 遇到的问题和解决方案
- Java 程序员排行前 10 的错误,你有没有中?
- java设计模式之设计原则①开闭原则
- 将coco数据集格式转变成voc数据格式
- 安川西格玛7驱动器手册_安川伺服驱动说明书7.pdf
- 安装教程之postman下载及安装
- 移动应用开发者的阶级状况:多数是无产阶级
- 台积电创始人张忠谋:英特尔不会重回巅峰;马斯克加入“催生”大军;2021国民年度十大流行语 | EA周报...
- oracle、mysql创建用户赋DBA权限
- 必看外国电影一百部,中国电影五十部
- Tsi721芯片驱动代码使用说明
- MySQL8.0登录提示caching_sha2_password问题解决方法
- python爬iptv直播源_GitHub - xkloveme/iptv-m3u: python 爬的直播源数据
- oracle中索引的使用
- ctr多少正常_亚马逊ctr多少算正常?
- 计算机在机电一体化应用,关于计算机技术在机电一体化专业中的应用探讨
- 2018年关于人工智能、大数据和分析的十大预测
- Java根据子节点获取最上层节点(根节点)数据和所有上级集合
热门文章
- carbide.c++ 插件开发入门(转)
- 【ARM体系结构】之相关概念与公司简介
- 【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(二弹)
- 10岁孩子学python还是c++好_学习Python还是C++?老男孩教育
- 电脑计算机如何把f盘分到d盘,电脑硬盘怎样把F盘的存储空间分到D盘的空间?
- GDI+(绘制图片背景文字)
- python-pyautogui微信自动发消息
- js本地缓存的三种方式
- EM算法及高斯混合模型GMM详述
- 工作中如何提高自己的能力?