深度学习:ResNet从理论到代码

news2024/11/24 16:52:26

深度学习:ResNet从理论到代码

  • 面临的问题
    • 模型退化问题
  • ResNet
    • 核心思想
    • 反向传播公式推导
    • 残差的由来
    • 残差模块为什么效果好
  • 代码实现

面临的问题

模型退化问题

在这里插入图片描述
随着网络层数加深,性能逐渐降低,但它并不是过拟合,因为在test error降低的同时,train error 也在降低。

可能的原因:网络训练过程中正反向信息流动不通畅,网络没有被完全训练。

ResNet

作者的思想是如果在一个浅层模型可以找到一个很好的结果,那么他的对应版本的深层网络也会很好,因为只需要在浅层网络后面加恒等映射就可以(就是浅层网络后面的层即使不干好事,但也不会变坏),可是优化器SGD很难做到恒等映射也就是不变的操作,于是就有了下面的ResNet。

核心思想

在这里插入图片描述
如上图所示,输入X,经过卷积层,ReLU激活得到F(X),然后计算F(x)+x得到H(x)。
H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x
x是残差块的输入,H(x)是输出,这种架构表示了即使Fx什么都不干,输出仍然会有x的信息,让网络不会变差。

句个🌰:

锐化操作实际上是一组特定的卷积核提取了图像某些特定的特征,然后与原图像合并进行视觉效果上的增强。
在这里插入图片描述
上图就可以看作原图x通过卷积层提取了相应的特征,然后把卷积层的输出与原图x在进行相加,这样就把卷积层感兴趣的特征与原图都保留了下来,就保证了图像/特征至少不会变坏。

在这里插入图片描述

其中由于ReNet可以堆叠100多层,为了让控制计算量,采用1 * 1 卷积投影降低计算量。

反向传播公式推导

请添加图片描述

残差的由来

在这里插入图片描述

听过上面的图我们发现,卷积层就是F(x),而Fx= hx-x 也就是输出-输入,所以我们把这个模块也叫做残差模块。

残差模块为什么效果好

在这里插入图片描述

我们可以把残差结构看成一个集成网络,把它展开后,可以看成多个小的网络求和的结果,那么他的健壮性就很好,即使干掉其中一个,他也可以保持很好的效果。

代码实现

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l


class Residual(nn.Module):  #@save
    def __init__(self, input_channels, num_channels,
                 use_1x1conv=False, strides=1):
        super().__init__()
        self.conv1 = nn.Conv2d(input_channels, num_channels,
                               kernel_size=3, padding=1, stride=strides)
        self.conv2 = nn.Conv2d(num_channels, num_channels,
                               kernel_size=3, padding=1)
        if use_1x1conv:
            self.conv3 = nn.Conv2d(input_channels, num_channels,
                                   kernel_size=1, stride=strides)
        else:
            self.conv3 = None
        self.bn1 = nn.BatchNorm2d(num_channels)
        self.bn2 = nn.BatchNorm2d(num_channels)

    def forward(self, X):
        Y = F.relu(self.bn1(self.conv1(X)))
        Y = self.bn2(self.conv2(Y))
        if self.conv3:
            X = self.conv3(X)
        Y += X
        return F.relu(Y)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多准则决策问题评估方法 | 灰云模型(含代码)

目前多准则决策问题的评估方法主要分为定性分析方法和定量分析方法两类。定性分析方法主要包括专家咨询、熵权法、案例研究和德尔菲法等;定量分析法主要包括层次分析法、主成分分析法、因子分析法、模糊综合评价法、灰色综合评价法以及数据包络分析法(DE…

Apollo星火计划学习笔记——Apollo路径规划算法原理与实践

文章目录1. 路径规划算法总体介绍1.1 Task: LANE_CHANGE_DECIDER1.2 Task: PATH_REUSE_DECIDER1.3 Task: PATH_BORROW_DECIDER1.4 Task: PATH_BOUNDS_DECIDER1.5 Task: PIECEWISE_JERK_PATH_OPTIMIZER1.6 Task&#xf…

人脸识别经典论文Arcface解读

来源:投稿 作者:小灰灰 编辑:学姐 研究背景 1、在人脸识别时,我们需要特征的discrimination 2、之前提出到的一些方法,如triplet loss,center loss, L-softmax,a-softmax都有一些缺陷。 3、centerloss:提…

2022.12.25 学习周报

文章目录摘要文献阅读1.题目2.摘要3.问题和方案4.介绍5.Attention Transfer5.1 Activation-based Attention Transfer5.2 Gradient-based Attention Transfer6.实验7.结论深度学习Attention机制的本质Encoder to Decoder抛开encoder-decoderAttention函数工作机制Attention机制…

20221225 海豚调度2.0.5连接星环库使用记录

阳阳的一周,算是挺过来了,现在只剩感冒了,迷迷糊糊的干了一周,混口饭吃不容易呀!简单记录一下遇到的问题吧! 连接hive(星环)数据库失败 方案一 : 海豚调度2.0.5使用的hive包是2.0版本,星环库包…

云原生之部署wordpress博客及设置圣诞主题风格

2022年圣诞节到来啦,很高兴这次我们又能一起度过~ CSDN诚邀各位技术er分享关于圣诞节的各种技术创意,展现你与众不同的精彩!参与本次投稿即可获得【话题达人】勋章【圣诞快乐】定制勋章(1年1次,错过要等下一年喔&#…

Python的条条框框

Python的条条框框 了解编程语言的分类 从运行角度的分类 从运行角度来看,编程语言的类型可以分为两种:编译型和解释型。 Python属于解释型语言。 解释型语言: 代码可以直接运行。当然,这也是依赖于附加程序(解释器&…

【VUE3】保姆级基础讲解(三)非父子组件通讯,$refs,动态组件,keep-alive,Composition API

目录 非父子组件通讯 全局事件总线mitt库 组件的生命周期 $refs 动态组件 keep-alive 异步打包 v-model绑定组件 Composition API 定义响应式数据 readonly toRefs与toRef computed $ref 生命周期钩子 provide和inject watch侦听 watchEffect script setup语法…

C++必须掌握的知识点

面向对象的三大特性 封装 继承 父类中所有的非静态成员都会被子类继承下去,只是父类的私有成员被编译器屏蔽了,访问不到。可以利用开发人员工具查看对象模型继承中,先构造父类,再构造子类,析构的顺序和构造的顺序完…

QT系列第8节 自定义对话框

在实际业务开发中经常要有各种各样的对话框来处理用户信息,本节就结合例子来说明如何自定义对话框。 目录 1.创建对话框 2.创建非模态对话框 3.创建模态对话框 4.综合案例 1.创建对话框 (1)项目鼠标右键菜单 - 添加新文件 (…

Hexo + Butterfly 自定义页脚

原文链接 :Hexo Butterfly 自定义页脚 推荐阅读 基于 Hexo 从零开始搭建个人博客(一): 环境准备基于 Hexo 从零开始搭建个人博客(二): 项目初识基于 Hexo 从零开始搭建个人博客(三): 主题安装…

CSDN每日一练最长递增的区间长度 C语言

题目名称:最长递增的区间长度 时间限制:1000ms 内存限制:256M 题目描述 给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3 (注意:测试用例仅做参考,…

Spring web开发之Request 获取三种方式

在开发 Java Web 项目中,我们经常使用 HttpServletRequest 获取请求参数、请求头等信息。在Spring项目,我们通常会使用 Spring 提供的注解获取参数,如 RequestParam、RequestHeader。 不过在某些场景下,我们可能需要从 HttpServl…

初识Docker:(4)Docker基本操作

初识Docker:(4)Docker基本操作1 镜像操作1.1 镜像名称1.2 镜像操作命令1.3 案例:docker拉取nginx镜像利用docker save将nginx镜像导出磁盘,然后再通过load加载回来1.4 镜像操作总结2 容器操作2.1 案例创建运行一个ngin…

【阅读笔记】《持续交付2.0》中理解分支、发布策略

文章目录1. 前言1.1 分支、发布 管理上解耦2. 主干 (Trunk) 和分支 (Branch)2.1 Trunk 开发 Trunk 发布2.1.1 Trunk 开发 Trunk 发布需要解决:重构的需求2.1.2 Trunk 开发 Trunk 发布需要解决:未开发完成的功能被带入发布版本2.2 Trunk 开发 Branch 发布…

leetcode:6272. 好分区的数目【思维转换(正难则反) + dp定义 + 背包问题 + 选or不选】

目录题目截图题目分析ac code总结题目截图 题目分析 先特判&#xff0c;如果sum(nums) < 2 * k显然不可能成功&#xff01;返回0出现Mod大概率就是dp1000的话提示我们用平方复杂度的dp这种取子序列的问题&#xff0c;本质就是选or不选的问题如果我们只考虑一维dp,dp[i]肯定…

Linux--信号

目录1. 信号概念2. 信号产生前2.1 信号产生的各种方式3. 信号产生中信号保存的方式3.1 阻塞信号3.2 信号屏蔽字4. 信号产生后信号处理的方式4.1 信号集操作函数4.2 sigprocmask函数4.3 sigpending函数4.4 sigaction函数5. 信号是什么时候被处理的1. 信号概念 信号是进程之间事…

golang访问KingbaseES V8R6

概述 本文介绍go语言连接KingbaseES V8R6数据库的步骤 测试环境 操作系统&#xff1a;CentOS 7.2.1511 数据库版本&#xff1a;KINGBASE (KingbaseES) V008R006C007B0012 go版本&#xff1a;go version go1.19.4 linux/amd64 KingbaseES go驱动获取 go连接kingbase数据库需…

MySQL为什么使用B+树为索引结构

目录 1、什么是索引 2、索引的类型 3、为什么要用索引 4、索引的使用场景 5、索引为什么要用B树&#xff0c;为什么不能用二叉树、红黑树、B树&#xff1f; 介绍一款可以帮助理解数据结构的网站&#xff08;很好用&#xff09;&#xff1a;Data Structure Visualization …

hadoop生产调优之Hadoop-Yarn 生产经验(参数调优)

一、常用的调优参数 1&#xff09;调优参数列表 &#xff08;1&#xff09;Resourcemanager 相关 yarn.resourcemanager.scheduler.client.thread-count ResourceManager 处理调度器请求的线程数量 yarn.resourcemanager.scheduler.class 配置调度器&#xff08;2&#xff0…