ResNet 学习

一. 残差块与残差层

        简单来说,残差块是构成残差层的基本单元,而残差层则是由多个残差块组成的。在ResNet中,通常会堆叠多个残差层来构建深度模型。

(一).残差块(Residual Block)

        这是ResNet的基本构建单元。一个残差块通常包含两个或三个卷积层(加上激活函数和批量归一化),然后将这个卷积操作的输出与输入直接相加。这种设计可以帮助解决深度神经网络训练过程中的梯度消失问题。

class Bottleneck(nn.Module):#这个类实现了一个残差块(Residual Block),这是典型的ResNet的"Bottleneck"设计。expansion = 4#表示输出特征图的通道数是输入特征图的通道数的4倍。def __init__(self, inplanes, planes, stride=1, downsample=None):super(Bottleneck, self).__init__()self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)self.bn1 = nn.BatchNorm2d(planes)self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,padding=1, bias=False)self.bn2 = nn.BatchNorm2d(planes)self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)self.bn3 = nn.BatchNorm2d(planes * 4)self.relu = nn.ReLU(inplace=True)self.downsample = downsampleself.stride = stride#stride步长def forward(self, x):residual = x#目的是保存输入x的原始值,以便在后面的计算中与卷积层的输出相加。out = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)if self.downsample is not None:residual = self.downsample(x)out += residualout = self.relu(out)return out

在ResNet(残差网络)的设计中,self.downsample通常是一个卷积层,用于改变输入数据的维度(例如,改变通道数或者空间尺寸),以便与主路径上卷积层的输出匹配。

如果self.downsample被定义了(即self.downsample is not None),那么输入数据x会通过self.downsample处理,然后作为残差连接添加到主路径上卷积层的输出上。这样,即使主路径上的卷积层改变了数据的维度,也能保证残差连接的输入和输出的维度是匹配的,从而可以进行相加。

(二).残差层(Residual Layer)

        这是由多个残差块串联组成的。在一个残差层中,输入数据首先通过一个残差块,然后输出被用作下一个残差块的输入,以此类推。每个残差层的输出通道数通常是固定的,但是可以通过调整残差块中卷积层的滤波器数量来改变。

    def _make_layer(self, block, planes, blocks, stride=1):downsample = Noneif stride != 1 or self.inplanes != planes * block.expansion:downsample = nn.Sequential(nn.Conv2d(self.inplanes, planes * block.expansion,kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(planes * block.expansion),)layers = []layers.append(block(self.inplanes, planes, stride, downsample))self.inplanes = planes * block.expansionfor i in range(1, blocks):layers.append(block(self.inplanes, planes))return nn.Sequential(*layers)

        在ResNet(残差网络)的设计中,每个残差层(Residual Layer)由多个残差块(Residual Block)组成。在每个残差层中,第一个残差块可能会改变输入的通道数和空间尺寸(宽度和高度),但是剩余的残差块都会保持通道数和空间尺寸不变。

        在PyTorch中,nn.Sequential 是一个容器模块,它包含了一系列子模块,这些子模块按照它们在构造函数中被传入的顺序进行排列。当 nn.Sequential 的 forward 方法被调用时,这些子模块会按照它们的排列顺序依次执行。

二.加载预训练模型参数

    def load_param(self, model_path):param_dict = torch.load(model_path)for i in param_dict:if 'fc' in i:continueself.state_dict()[i].copy_(param_dict[i])
  1. param_dict = torch.load(model_path):使用 PyTorch 的 torch.load() 函数从指定的文件中加载模型参数。这些参数被保存在一个字典中,字典的键是参数的名称,值是参数的值。

  2. for i in param_dict::遍历加载的参数字典。

  3. if 'fc' in i: continue:如果当前参数的名称中包含 'fc',则跳过这个参数。这通常用于在加载参数时跳过全连接层(Fully Connected layer,简称fc)的参数。

  4. self.state_dict()[i].copy_(param_dict[i]):将加载的参数复制到当前模型的对应参数中。self.state_dict() 是获取当前模型的参数字典,[i] 是获取对应的参数,copy_ 函数是将加载的参数复制到当前参数中。

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

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

相关文章

大语言模型的工程技巧(二)——混合精度训练

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 混合精度训练的示例请参考如下链接:regression2chatgpt/ch11_llm/gpt2_lora_optimum.ipynb 本文将讨论如何利用混合…

将本地HtmL网站打包成exe

将本地HTML网站打包成exe文件,可以使用工具如NW.js、Electron等。这些工具允许你将HTML、CSS和JavaScript打包成一个独立的可执行文件。下面以Electron为例,介绍具体步骤: 准备工作 安装Node.js和npm: Electron依赖于Node.js和np…

Java语法篇-易错

文章目录 类型转换switch case类之间关系及UMLtry catch finally 类型转换 隐式类型转换,不同数值类型参与计算时,低精度会转化为高精度参与运算 byte,short,char参与整数运算时会转成int float,int 参与浮点数运算时会转成double 强制类型转换 高精…

数据结构 —— 栈 与 队列

1.栈 1.1栈的结构和概念 栈(Stack)是一种特殊的线性数据结构,它遵循后进先出(LIFO,Last In First Out)的原则。栈只允许在一端插入和删除数据,这一端被称为栈顶(top)&a…

c++引用和内联函数

一、引用 1.引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。(引用类型必须和引用实体是同种类型的),如&#x…

MySQL--联合索引应用细节应用规范

目录 一、索引覆盖 1.完全覆盖 2.部分覆盖 3.不覆盖索引-where条件不包含联合索引的最左则不覆盖 二、MySQL8.0在索引中的新特性 1.不可见索引 2.倒序索引 三、索引自优化--索引的索引 四、Change Buffer 五、优化器算法 1.查询优化器算法 2.设置算法 3.索引下推 …

2024年NGFW防火墙安全基准-防火墙安全功效竞争性评估实验室总结报告

Check Point 委托 Miercom 对 Check Point 下一代防火墙 (NGFW) 开展竞争性安全有效性测试, 选择的竞品分别来自 Cisco、Fortinet 和 Palo Alto Networks。对 Zscaler 的测试涉及他们的 SWG(安全网关)。测试内容包括验证防病毒、反恶意软件、…

SpringBoot+Vue开发记录(六)-- 后端配置mybatis

原型图什么的就先不管,后面再写。 本篇文章的主要内容就是springboot通过mybatis操作数据库实现增删改查。 重点是mybatis配置与相关文件数据,以后开新项目忘记了怎么配置的话可以再照着这个搞。 这算是最基础的部分了吧。 文章目录 一,配置…

基于STM32的自动宠物喂食器的Proteus仿真

文章目录 一、宠物喂食器1.题目要求2.思路2.1 OLED显示汉字2.2 DS1302模块2.3 液位传感器2.4 压力传感器和步进电机驱动 3.仿真图3.1 未仿真时3.2 开始仿真,OLED初始界面显示实时时间3.3 通过设置按键进入模式选择和喂食时间设置3.4 进入喂食时间设置3.5 设置好喂食…

计算机毕业设计Python+Spark+PyTroch游戏推荐系统 游戏可视化 游戏爬虫 神经网络混合CF推荐算法 协同过滤推荐算法 steam 大数据

毕业设计(论文) 基于SpringBoot的游戏防沉迷系统的设计与实现 摘 要 随着网络游戏市场的持续火爆,其最明显的负面影响----“网络游戏沉迷问题”已成为当前社会普遍关心的热点问题。根据2010年8月1日实施的《网络游戏管理暂行办法》,网络游…

代码随想录算法训练营第三十四天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

860.柠檬水找零 遇到账单20,优先消耗美元10,完成本次找零。因为5的用处更大,等到循环结束的时候,如果存在某个美元不够用的情况,那么就是无法找零。 406.根据身高重建队列 先考虑身高维度,将身高从大至小…

图书管理系统——Java版

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:JavaSE 顺序表的学习,点我 目录 图书管理系统菜单 基本框架: 书: 书架: 用户&#xff…

数字化转型必备:营销策划流程图,打造你的数字市场地图

制作营销策划流程图是一个系统化的过程,它可以帮助你清晰地规划和展示营销活动的各个阶段。 以下是制作营销策划流程图的步骤: 1.确定营销目标: 明确你的营销活动旨在实现的具体目标,比如提升品牌知名度、增加销售额、吸引新客…

Java进阶学习笔记25——Objects类

为啥比较两个对象是否相等,要用Objects的equals方法,而不是用对象自己的equals方法来解决呢? Objects: Objects类是一个工具类,提供了很多操作对象的静态方法供我们使用。 package cn.ensource.d14_objects;import ja…

python使用pandas操作xlsx

python操作xlsx有很多种方法,以前使用其他控件操作,使用这个pandas之后发现更好用。场景,我需要读取xlsx模板,然后根据模板去获取数据,根据用户要求导出指定的xlsx文件。 读取文件 data pd.read_excel(sleepStageAh…

Hadoop概览以及编译hadoop说明

一、Hadoop概述 Hadoop 是一个用于跨计算机集群存储和处理大型数据集的软件框架。它旨在处理大数据,即传统数据库无法有效管理的极其庞大和复杂的数据集。Hadoop不是传统意义上的数据仓库,因为它们的用途不同,架构也不同。Hadoop 是一个跨分布…

uniapp开发微信小程序问题集锦(1)

1,uniapp实现微信小程序手机号快速登陆 看uniapp的官方文档,之前用的是uni.login会返回一个短code,后端是用不了的,后面通过询问才知道因该是使用button的方法getphonenumber这样能够获取到手机号,并返回一个长code,这…

分割大模型论文阅读——SAM-Med2D

SAM-Med2D 期刊分析摘要引言相关工作方法将医学知识纳入 SAM从 SAM 过渡到 SAM-Med2D评估 SAM-Med2D实验与评估实施细节定量评价定性比较讨论与结论期刊分析 期刊名: ArXiv 期刊信息: 暂无

AWS之云从业者题库笔记

elasticity:弹性durable:耐用的;持久的You can also use CloudWatch in hybrid cloud architectures by using the CloudWatch Agent or API to monitor your on-premises resources.cost allocation tags:成本分配标签cose elimi…

Vue2基础及其进阶面试(二)

vue2的生命周期 删除一些没用的 App.vue 删成这个样子就行 <template><router-view/></template><style lang"scss"></style>来到路由把没用的删除 import Vue from vue import VueRouter from vue-router import HomeView from .…