深度学习pytorch——经典卷积网络之ResNet(持续更新)

错误率前五的神经网络(图-1):

图-1

可以很直观的看到,随着层数的增加Error也在逐渐降低,因此深度是非常重要的,但是学习更好的网络模型和堆叠层数一样简单吗?通过实现表明(图-2),并不是如此,会出现梯度消失和梯度爆炸的现象,甚至比堆叠之前的训练效果更差,这种现象被称为梯度退化。 

图-2

如何保证梯度不退化,即随着堆叠层数的增加,训练模型不会比堆叠之前还要差?深度残差网络(Deep Residual Learning,ResNet)的提出很好的解决了这一问题,并且不仅没有增加额外的参数,也没有增加计算的复杂度。

ResNet在普通网络的基础上插入了短路(shortcut connection)(图-3),将这个网络变成了ResNet。

图-3

以上的叙述知识思想层面的,将思想转化为实操,离不开背后的数学原理(图-4)。

图-4

我们将最后的输出设置为 H(x)  ,我们将堆叠的非线性层去拟合F(x) = H(x) - x ,原来的映射就变成了F(x) + x (F(x)必须和x的维度相同,如果不相同可是使用1*1卷积或者增加padding)。相当于我们在一些非线性对叠层之间插入了一个短路(shortcut connection),如果堆叠之后的模型的训练Error比之前还要差,就会直接走短路通道,如果堆叠之后的模型比之前好了,就进行堆叠,至于在几个堆叠层之间插入一个短路,这取决于训练的参数。

使用ResNet模型并不需要建立新的求解器,我们可以直接使用公共库,代码演示如下:

class ResBlk(nn.Module):
    """
    resnet block
    """

    def __init__(self, ch_in, ch_out):
        """
        :param ch_in:
        :param ch_out:
        """
        super(ResBlk, self).__init__()

        self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1)
        self.bn1 = nn.BatchNorm2d(ch_out)
        self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(ch_out)

        #如果shortcut的输入和输出层的channel不一样,可以用一个1*1的卷积让他们变成一样

        self.extra = nn.Sequential()
        if ch_out != ch_in:
            # [b, ch_in, h, w] => [b, ch_out, h, w]
            self.extra = nn.Sequential(
                nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=1),
                nn.BatchNorm2d(ch_out)
            )


    def forward(self, x):
        """
        :param x: [b, ch, h, w]
        :return:
        """
        out = F.relu(self.bn1(self.conv1(x)))  #激活函数,也可以在上面的网络(第25行)写nn.ReLU
        out = self.bn2(self.conv2(out))
        # short cut.
        # extra module: [b, ch_in, h, w] => [b, ch_out, h, w]
        # element-wise add:
        out = self.extra(x) + out

        return out

这个代码来自于课时72 ResNet与DenseNet-2_哔哩哔哩_bilibili 

中间关于这个思想的解释来自于我自己对Deep Residual Learning for Image Recognition 论文的理解,如果有什么问题,欢迎各位大佬指正,我将会感激不尽。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络 各个模块介绍(Pytorch 07)

一 网络层和块 单个神经网络(1)接受一些输入;(2)生成相应的标量输出;(3)具有一组相关 参数(parameters),更新这些参数 可以优化某目标函数。 当…

排序第五篇 归并排序

一 简介 归并排序(Merge Sort) 的基本思想是: 首先将待排序文件看成 n n n 个长度为1的有序子文件, 把这些子文件两两归并, 得到 n 2 \frac{n}{2} 2n​ 个长度为 2 的有序子文件; 然后再把这 n 2 \frac{n}{2} 2n​ 个有序的子…

Go-React做一个todolist(服务端)【一】项目初始化

后端仓库地址 地址 项目依赖 # gin go get -u github.com/gin-gonic/gin # viper日志 go get -u github.com/spf13/viper # 数据库和gorm go get -u gorm.io/driver/mysql go get -u gorm.io/gorm # uuid go get -u github.com/google/uuid # token go get -u github.com/go…

cron服务

Cron文件:Cron服务使用一个特定的配置文件来存储任务和其执行计划。在Unix系统上,这个文件通常是 /etc/crontab, 或者是位于/etc/cron.d/目录下的其他文件。 这些文件包含了任务的定义,包括执行时间和要执行的命令。 类似于 编…

JavaSE:继承和多态(上篇)

目录 一、前言 二、继承 (一)继承概念 (二)继承的语法 (三)父类成员访问 1.子类中访问父类的成员变量 1.1子类和父类不存在同名成员变量 1.2子类和父类成员变量同名 2.子类中访问父类的成员方法 &a…

SOA-面向服务架构

SOA-面向服务架构 1.概述2.SOA的设计原则包括:3. SOA实现方法1.Web Service2. 服务注册表3. 企业服务总线 细讲 超赞笔记 1.概述 SOA (Service-Oriented Architecture,SOA),从应用和原理的角度,目前有2种…

Ubuntu20.04 server系统部署安装(VMware上)和初始化配置

Ubuntu20.04 server部署安装(VMware上)和初始化配置 一、Ubuntu20.04 server系统部署安装上下键控制上下,可以选择配置的目标,回车表示确定,并进行下一步1.1镜像下载2.1 VMware上创建虚拟机2.2 选择语言,键…

STM32CubeIDE基础学习-HC05蓝牙模块和手机通信

STM32CubeIDE基础学习-HC05蓝牙模块和手机通信 文章目录 STM32CubeIDE基础学习-HC05蓝牙模块和手机通信前言第1章 硬件连接第2章 工程配置第3章 代码编写3.1 手机指令控制LED 第4章 实验现象总结 前言 前面的文章学习了串口通过轮询和中断的简单使用方法,现在就来用…

解密AI人工智能的整体分层架构:探索智能科技的未来之路

随着人工智能技术的迅猛发展,AI已经渗透到我们生活的方方面面。而支撑AI人工智能系统运作的核心是其整体分层架构。本文将深入探讨AI人工智能的整体分层架构,揭示其中的奥秘,探索智能科技的未来之路。 ### AI人工智能整体分层架构的重要性 …

Java:链表

一、链表简介 1、链表与顺序表的区别 上一篇博客我介绍了顺序表,这次我们来认识认识链表!先来看看二者的区别: 顺序表:由于顺序表实际上是一个数组,因此它在物理上是连续的,逻辑上也是连续的! …

uniapp怎么使用接口返回的iconfont图标

uniapp怎么使用接口返回的iconfont图标 首先在你的项目中添加该图标&#xff0c;名称要对应 实际应用 item.ICONFONT_NAME“tools”; item.ICONFONT_COLOR“FA5151”; <view class"iconfont" :class"icon-item.ICONFONT_NAME" :color"item.ICON…

Appium 三种wait方法(appium 学习之改造轮子)

学过selenium的都知道&#xff0c;一般等待元素加载有三种办法: sleep Thread.sleep&#xff08;60000&#xff09; 强制等待60simplicitlyWait driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 隐式等待&#xff0c;全局等…

vue-ueditor-wrap上传图片报错:后端配置项没有正常加载,上传插件不能正常使用

如图所示&#xff0c;今天接收一个项目其中富文本编辑器报错 此项目为vue2项目&#xff0c;富文本编辑器为直接下载好的资源存放在public目录下的 经过排查发现报错的函数在ueditor.all.min.js文件内&#xff0c;但是ueditor.all.min.js文件夹是经过压缩的 所以直接&#xff…

Transformer论文阅读

Transformer论文阅读 摘要结论1 Introduction &#xff08;导言&#xff09;2 Background3 Model Architecture3.1 Encoder and Decoder StacksEncoderLayer NormDecoder 3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Scaled Dot-Product Attention3.2.3 Application…

SAP Fiori开发中的JavaScript基础知识9 - 代码注释,严格模式,JSON

1 背景 本文将介绍JavaScript编程中的三个小知识点&#xff1a;也即代码注释&#xff0c;严格模式&#xff0c;JSON文件。 2 代码注释 JavaScript的代码注释方式如下&#xff1a; // Single line comment/* Multi line comment */3 严格模式 JavaScript的"strict mod…

【Flume】尚硅谷学习笔记

实时监控目录下多个新文件 本案例是将虚拟机本地文件进行实时监控&#xff0c;并将上传的数据实时上传到HDFS中。 TAILDIR SOURCE【实现多目录监控、断点续传】 监视指定的文件&#xff0c;一旦检测到附加到每个文件的新行&#xff0c;就几乎实时地跟踪它们。如果正在写入新行…

前端学习<二>CSS基础——10-CSS3选择器详解

CSS3介绍 CSS3在CSS2基础上&#xff0c;增强或新增了许多特性&#xff0c; 弥补了CSS2的众多不足之处&#xff0c;使得Web开发变得更为高效和便捷。 CSS3的现状 浏览器支持程度不够好&#xff0c;有些需要添加私有前缀 移动端支持优于PC端 不断改进中 应用相对广泛 ### …

网络性能提升10%,ZStack Edge 云原生超融合基于第四代英特尔®至强®可扩展处理器解决方案发布

随着业务模式的逐渐转变、业务架构逐渐变得复杂&#xff0c;同时容器技术的兴起和逐渐成熟&#xff0c;使得Kubernetes、微服务等新潮技术逐步应用于业务应用系统上。 为了充分释放性能、为业务系统提供更高效的运行环境&#xff0c;ZStack Edge 云原生超融合采用了第四代英特尔…

第十四届蓝桥杯javaA组 阶乘的和

这个题我做的时候已经看出来&#xff0c;最小的m一定是最小的Ai&#xff0c;然后如果想让想让m1那么只能让最小的Ai的数量是m1的倍数因为比如说mAmin 1 那么想让m&#xff01;是 Ai阶乘和的倍数只有 nAmin&#xff01;%m&#xff01;0 然后我就不知道如何就m等于Amin2的情况了…

Spring 自定义注解 为 BeanDefinition 添加 qualifier 信息 从而约束自动装配范围

为什么写这篇文章 Spring 支持类型注入&#xff0c;并且可以通过Qualifier 或者Mate 调整类型注入的范围。但是通过自定义注解结合现有的 Qualifier 使用起来有种种困难。 将 Qualifier 融合在自定义注解中&#xff0c;在使用 AliasFor 遇到问题仅仅检查注解中的一部分内容是否…