全文共1483字,5张图,预计阅读时间10分钟。

作者介绍:

石晓文,中国人民大学信息学院在读研究生,美团外卖算法实习生

简书ID:石晓文的学习日记(https://www.jianshu.com/u/c5df9e229a67)

天善社区:https://www.hellobi.com/u/58654/articles

腾讯云:https://cloud.tencent.com/developer/user/1622140

开发者头条:https://toutiao.io/u/470599

论文地址:https://arxiv.org/pdf/1512.03385.pdf

引言-深度网络的退化问题

在深度神经网络训练中,从经验来看,随着网络深度的增加,模型理论上可以取得更好的结果。但是实验却发现,深度神经网络中存在着退化问题(Degradation problem)。可以看到,在下图中56层的网络比20层网络效果还要差。

上面的现象与过拟合不同,过拟合的表现是训练误差小而测试误差大,而上面的图片显示训练误差和测试误差都是56层的网络较大。

深度网络的退化问题至少说明深度网络不容易训练。我们假设这样一种情况,56层的网络的前20层和20层网络参数一模一样,而后36层是一个恒等映射( identity mapping),即输入x输出也是x,那么56层的网络的效果也至少会和20层的网络效果一样,可是为什么出现了退化问题呢?因此我们在训练深层网络时,训练方法肯定存在的一定的缺陷。

正是上面的这个有趣的假设,何凯明博士发明了残差网络ResNet来解决退化问题!让我们来一探究竟!

ResNet网络结构

ResNet中最重要的是残差学习单元:

对于一个堆积层结构(几层堆积而成)当输入为x时其学习到的特征记为H(x),现在我们希望其可以学习到残差F(x)=H(x)-x,这样其实原始的学习特征是F(x)+x 。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。一个残差单元的公式如下:

后面的x前面也需要经过参数Ws变换,从而使得和前面部分的输出形状相同,可以进行加法运算。

在堆叠了多个残差单元后,我们的ResNet网络结构如下图所示:

ResNet代码实战

我们来实现一个mnist手写数字识别的程序。代码中主要使用的是tensorflow.contrib.slim中定义的函数,slim作为一种轻量级的tensorflow库,使得模型的构建,训练,测试都变得更加简单。卷积层、池化层以及全联接层都可以进行快速的定义,非常方便。这里为了方便使用,我们直接导入slim。

import tensorflow.contrib.slim as slim

我们主要来看一下我们的网络结构。首先定义两个残差结构,第一个是输入和输出形状一样的残差结构,一个是输入和输出形状不一样的残差结构。

下面是输入和输出形状相同的残差块,这里slim.conv2d函数的输入有三个,分别是输入数据、卷积核数量、卷积核的大小,默认的话padding为SAME,即卷积后形状不变,由于输入和输出形状相同,因此我们可以在计算outputs时直接将两部分相加。

def res_identity(input_tensor,conv_depth,kernel_shape,layer_name):with tf.variable_scope(layer_name):relu = tf.nn.relu(slim.conv2d(input_tensor,conv_depth,kernel_shape))outputs = tf.nn.relu(slim.conv2d(relu,conv_depth,kernel_shape) + input_tensor)return outputs

下面是输入和输出形状不同的残差块,由于输入和输出形状不同,因此我们需要对输入也进行一个卷积变化,使二者形状相同。ResNet作者建议可以用1*1的卷积层,stride=2来进行变换:

def res_change(input_tensor,conv_depth,kernel_shape,layer_name):with tf.variable_scope(layer_name):relu = tf.nn.relu(slim.conv2d(input_tensor,conv_depth,kernel_shape,stride=2))input_tensor_reshape = slim.conv2d(input_tensor,conv_depth,[1,1],stride=2)outputs = tf.nn.relu(slim.conv2d(relu,conv_depth,kernel_shape) + input_tensor_reshape)return outputs

最后是整个网络结构,对于x的输入,我们先进行一次卷积和池化操作,然后接入四个残差块,最后接两层全联接层得到网络的输出。

def inference(inputs):x = tf.reshape(inputs,[-1,28,28,1])conv_1 = tf.nn.relu(slim.conv2d(x,32,[3,3])) #28 * 28 * 32pool_1 = slim.max_pool2d(conv_1,[2,2]) # 14 * 14 * 32block_1 = res_identity(pool_1,32,[3,3],'layer_2')block_2 = res_change(block_1,64,[3,3],'layer_3')block_3 = res_identity(block_2,64,[3,3],'layer_4')block_4 = res_change(block_3,32,[3,3],'layer_5')net_flatten = slim.flatten(block_4,scope='flatten')fc_1 = slim.fully_connected(slim.dropout(net_flatten,0.8),200,activation_fn=tf.nn.tanh,scope='fc_1')output = slim.fully_connected(slim.dropout(fc_1,0.8),10,activation_fn=None,scope='output_layer')return output

完整的代码地址在:https://github.com/princewen/tensorflow_practice/tree/master/CV/ResNet

参考方式

1、论文:https://arxiv.org/pdf/1512.03385.pdf

2、https://blog.csdn.net/kaisa158/article/details/81096588?utm_source=blogxgwz4

原文链接:https://mp.weixin.qq.com/s/AsCF4dsuS-XTF1Yr_tKKTQ

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org

请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

残差网络ResNet网络原理及实现相关推荐

  1. PyTorch实现:经典网络 ResNet

    经典网络 ResNet 1 简述 GoogleNet 和 VGG 等网络证明了,更深度的网络可以抽象出表达能力更强的特征,进而获得更强的分类能力.在深度网络中,随之网络深度的增加,每层输出的特征图分辨 ...

  2. 大话深度残差网络(DRN)ResNet网络原理

    -- 原文发布于本人的微信公众号"大数据与人工智能Lab"(BigdataAILab),欢迎关注. 一说起"深度学习",自然就联想到它非常显著的特点" ...

  3. 经典网络之深度残差网络(DRN)ResNet网络原理

    原文链接 2015年提出 讨论:深的网络一般会比浅的网络效果好,如果要进一步地提升模型的准确率,最直接的方法就是把网络设计得越深越好,这样模型的准确率也就会越来越准确? 实验论证:在网络很深的时候(5 ...

  4. 【深度学习之ResNet】——深度残差网络—ResNet总结

    目录 论文名称:Deep Residual Learning for Image Recognition 摘要: 1.引言 2.为什么会提出ResNet残差网络呢? 3.深度残差网络结构学习(Deep ...

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

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

  6. 残差网络resnet详解

    1 产生背景 网络的深度对于特征提取具有至关重要的作用,实验证得,如果简单的增加网络深度,会引起退化问题[Degradation问题],即准确率先上升然后达到饱和,再持续增加深度会导致准确率下降.该实 ...

  7. resnet网络结构_深度学习之16——残差网络(ResNet)

    残差网络在设计之初,主要是服务于卷积神经网络(CNN),在计算机视觉领域应用较多,但是随着CNN结构的发展,在很多文本处理,文本分类里面(n-gram),也同样展现出来很好的效果. 首先先明确一下几个 ...

  8. 深度残差网络ResNet解析

    ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它"简单与实用"并存,之后很多方法都建立在ResNet50或者ResNet1 ...

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

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

最新文章

  1. SIGIR 2020 | 第四范式提出深度稀疏网络模型,显著提升高维稀疏表数据分类效果...
  2. iphone 系统文件夹
  3. 高效多用的群集-Haproxy搭建Web集群
  4. 魅族内斗;中兴危机;阿里百度要回 A 股 | CSDN极客头条
  5. 关于DHCP超级域与中继代理的疑问
  6. 语音识别在智能交通中的几种应用分析
  7. java 微信导航栏_微信小程序教程系列之设置标题栏和导航栏
  8. @QueryParam和@PathParam的区别
  9. Ueditor 使用
  10. C++ dlib实现人脸识别
  11. 数据库 求闭包、求候选码、范式转换、最小依赖集、无损分解及保持函数依赖
  12. 网络设备高可用性简例
  13. 生鲜行业数字化采购管理系统:助力生鲜企业解决采购难题,全程线上化采购执行
  14. 如何打开html格式文件?Win11打开html文件的方法
  15. 关于5G,你必须知道的事儿……
  16. 【Android】Android SurfaceFlinger之BufferQueue
  17. 磁盘类型转换(fat转换ntfs)
  18. SQLServer·面试题
  19. NGINX免费配置二级域名及同时开启HTTPS(HTTP强制转HTTPS)nodejs的express后端项目,前端next.js的SSR项目
  20. 基于单片机定时闹钟设计

热门文章

  1. 案例 | 美创助力锦州医科大学附属第一医院容灾建设实践
  2. 造梦日记 Printidea 用户手册
  3. 元宇宙、Web3.0潮起,欧科云链:区块链+大数据深耕科技创新
  4. 华为/CMCC的Portal协议研究纪要
  5. 使用ggplot2进行数据可视化—坐标系(七)
  6. apscheduler 遇到的问题
  7. 特征选择与稀疏学习——机器学习(周志华)
  8. js完成卡片式列表效果(移动+阴影)
  9. ftp获取远程服务器的文件,ftp查看远程服务器文件
  10. 在CentOS下安装MySQL