pytorch backbone
1 简介
在PyTorch深度学习中,预训练backbone(骨干网络)是一个常见的做法,特别是在处理图像识别、目标检测、图像分割等任务时。预训练backbone通常是指在大型数据集(如ImageNet)上预先训练好的卷积神经网络(CNN)模型,这些模型能够提取图像中的通用特征,这些特征在多种任务中都是有用的。
1. 常见的预训练Backbone
以下是一些在PyTorch中常用的预训练backbone:
- ResNet:由何恺明等人提出的深度残差网络,通过引入残差连接解决了深层网络训练中的梯度消失或梯度爆炸问题。ResNet系列包括ResNet-18、ResNet-34、ResNet-50、ResNet-101、ResNet-152等,数字表示网络的层数。
- VGG:由牛津大学的Visual Geometry Group提出,特点是使用了多个小卷积核(如3x3)的卷积层和池化层来构建深层网络。VGG系列包括VGG16、VGG19等。
- MobileNet:专为移动和嵌入式设备设计的轻量级网络,通过深度可分离卷积减少了计算量和模型大小。
- DenseNet:通过密集连接(dense connections)提高了信息流动和梯度传播效率,进一步增强了特征重用。
- EfficientNet:通过同时缩放网络的深度、宽度和分辨率来优化网络,实现了在保持模型效率的同时提高准确率。
2. 如何使用预训练Backbone
在PyTorch中,使用预训练backbone通常涉及以下几个步骤:
导入模型:使用PyTorch的
torchvision.models模块导入所需的预训练模型。import torchvision.models as models # 导入预训练的ResNet50模型 resnet50 = models.resnet50(pretrained=True) print(resnet50)修改模型:根据需要修改模型的最后几层以适应特定的任务(如分类任务中的类别数)。
# 假设我们有一个100类的分类任务 num_ftrs = resnet50.fc.in_features resnet50.fc = torch.nn.Linear(num_ftrs, 100)冻结backbone:在训练时,可以选择冻结backbone的参数,只训练新添加的层(如分类层),这有助于加快训练速度并防止过拟合。
for param in resnet50.parameters(): param.requires_grad = False # 只对新添加的层设置requires_grad=True resnet50.fc.parameters().requires_grad = True训练模型:使用适当的数据集和训练策略来训练模型。
评估模型:在测试集上评估模型的性能。
3. 注意事项
- 使用预训练权重时,应确保输入图像的预处理(如大小调整、归一化等)与预训练时使用的预处理一致。
- 冻结backbone时,应确保模型的其余部分(如新添加的层)有足够的容量来学习任务特定的特征。
- 在某些情况下,解冻backbone的一部分或全部并在目标数据集上进行微调可能会获得更好的性能。
通过以上步骤,可以在PyTorch中有效地利用预训练backbone来解决各种计算机视觉任务。
2 查看模型源码
想查看models.resnet50的源码,可以点击查看pytorch中的官方注释,可以看到源码链接为
vision/torchvision/models/resnet.py at main · pytorch/vision · GitHub
这样就可以看到 class ResNet(nn.Module) 的定义
3 查看权重参数
在PyTorch中,查看深度学习预训练backbone的权重参数可以通过几种方法实现。以下是一些常用的步骤和方法:
1. 加载预训练模型
首先,你需要使用
torchvision.models模块加载所需的预训练模型。例如,加载一个预训练的ResNet50模型:import torchvision.models as models # 加载预训练的ResNet50模型 resnet50 = models.resnet50(pretrained=True)2. 查看模型参数
方法一:使用
model.parameters()
model.parameters()方法返回一个生成器,包含模型的所有参数(权重和偏置)。但是,这个方法不会直接显示参数的名称,只适合在训练循环中迭代参数。方法二:使用
model.named_parameters()
model.named_parameters()方法返回一个生成器,其中每个元素都是一个包含参数名称和参数本身的元组。这是查看模型每层权重参数及其名称的最直接方法。for name, param in resnet50.named_parameters(): print(name, param.size())这段代码会遍历模型的所有参数,并打印出每个参数的名称和尺寸。
3. 专注于特定层的参数
如果你只对backbone中的特定层感兴趣,可以进一步筛选
named_parameters()的输出。例如,如果你想看ResNet50中第一个卷积层的参数:for name, param in resnet50.named_parameters(): if 'conv1' in name: print(name, param.size())4. 注意事项
- 当查看模型参数时,请确保你了解模型的架构,以便正确地解释参数的名称和尺寸。
- 预训练模型的权重是在特定数据集(如ImageNet)上训练的,因此这些权重可能对你的特定任务有所帮助,但也可能需要进一步的微调。
- 如果你的模型是基于预训练模型进行修改的(例如,更改了最后一层以匹配不同的类别数),请确保你理解这些修改如何影响模型的参数。
5. 示例输出
运行上述代码(针对ResNet50的
named_parameters())将输出类似以下的信息(输出将非常长,这里只展示部分):conv1.weight torch.Size([64, 3, 7, 7]) conv1.bias torch.Size([64]) bn1.weight torch.Size([64]) bn1.bias torch.Size([64]) bn1.running_mean torch.Size([64]) bn1.running_var torch.Size([64]) ...这表示
conv1层有一个权重参数(大小为[64, 3, 7, 7])和一个偏置参数(大小为[64]),以及对应的批量归一化层的权重、偏置、运行均值和运行方差等参数。
4 常见bakcbone以及适用业务
在PyTorch中,预训练的backbone模型是深度学习领域中的重要组成部分,它们为各种任务提供了强大的特征提取能力。然而,由于PyTorch本身是一个灵活的深度学习框架,它并不直接提供所有可能的预训练backbone模型,而是由社区和研究者基于PyTorch框架实现并分享。以下是一些常见的PyTorch预训练backbone模型,以及它们的优劣和适用场景:
1. ResNet(残差网络)
优势:
- 引入了残差连接,解决了深层网络训练中的梯度消失或梯度爆炸问题。
- 在多个计算机视觉任务中表现出色,如图像分类、目标检测等。
劣势:
- 对于某些特定任务,可能不是最优选择,需要根据任务特点进行调整。
适用场景:
- 图像分类、目标检测、语义分割等。
2. VGG
优势:
- 结构简单明了,易于理解和实现。
- 在多个基准数据集上取得了良好的性能。
劣势:
- 参数量较大,计算成本较高。
适用场景:
- 早期深度学习研究和教学。
3. MobileNet
优势:
- 专为移动和嵌入式设备设计,具有较小的模型大小和较快的推理速度。
- 采用了深度可分离卷积等技术,减少了计算量和参数量。
劣势:
- 相比于其他大型模型,可能在某些复杂任务上的精度稍低。
适用场景:
- 移动应用、嵌入式设备上的实时图像处理和分类。
4. DenseNet(密集连接网络)
优势:
- 每一层都直接与后面的所有层相连,增强了特征传播和复用。
- 在多个数据集上取得了比ResNet更好的性能。
劣势:
- 参数量和计算量相对较大。
适用场景:
- 需要高精度和强特征表达能力的任务,如医学图像分析。
5. EfficientNet
优势:
- 通过复合缩放方法(compound scaling)平衡了网络的深度、宽度和分辨率,实现了在有限资源下的最佳性能。
- 在多个计算机视觉任务中取得了SOTA(state-of-the-art)性能。
劣势:
- 需要根据具体任务进行微调以获得最佳性能。
适用场景:
- 追求极致性能的计算机视觉任务,如大规模图像分类和检测。
6. YOLOv5的Backbone(如CSPDarknet)
优势:
- 专为目标检测任务设计,具有较快的推理速度和较高的检测精度。
- 采用了CSPNet等结构,进一步提升了网络性能。
劣势:
- 相比于专门的分类网络,可能在分类任务上的性能稍逊。
适用场景:
- 实时目标检测任务,如自动驾驶、视频监控等。
请注意,以上列举的backbone模型并不全面,PyTorch社区和研究者们不断在推出新的模型和架构。此外,每种模型都有其特定的优势和劣势,以及适用的场景。在选择模型时,需要根据具体任务的需求、计算资源等因素进行综合考虑。
对于PyTorch中预训练backbone模型的获取,可以通过PyTorch的官方模型库(如
torchvision)或第三方库(如timm、pretrainedmodels等)来获取。这些库提供了大量预训练的backbone模型,并支持多种加载和使用方式。
5 从backbone提取特征图(☆)
import torch
import torch.nn as nn
import torchvision.models as models
from collections import OrderedDictclass ResNet18(nn.Module):def __init__(self):super().__init__()self.resnet18 = models.resnet18(pretrained=True)def forward(self, x):features = OrderedDict()x = self.resnet18.conv1(x)x = self.resnet18.bn1(x)x = self.resnet18.relu(x)x = self.resnet18.maxpool(x)features['3'] = xx = self.resnet18.layer1(x)x = self.resnet18.layer2(x)features['2'] = xx = self.resnet18.layer3(x)features['1'] = xx = self.resnet18.layer4(x)features['0'] = xreturn featuresmodel = ResNet18()
input = torch.ones(1, 3, 640, 640) # NCHW
y = model(input)
for key, value in y.items():print(key, value.shape)
打印信息
3 torch.Size([1, 64, 160, 160])
2 torch.Size([1, 128, 80, 80])
1 torch.Size([1, 256, 40, 40])
0 torch.Size([1, 512, 20, 20])
相关文章:
pytorch backbone
1 简介 在PyTorch深度学习中,预训练backbone(骨干网络)是一个常见的做法,特别是在处理图像识别、目标检测、图像分割等任务时。预训练backbone通常是指在大型数据集(如ImageNet)上预先训练好的卷积神经网络…...
uniapp 开发app使用renderjs操作dom
需求:把页面中的对话内容另存为一张图片保存到手机相册。 解决方案:这时我们需要使用到document对象创建一个dom对象计算对话内容的宽高、位置等,再利用canvas能力将内容绘制绘制成一张图保存。 现状:总所周知,非H5端&…...
【面试题】MySQL `EXPLAIN`的`Extra`字段:深入解析查询优化的隐藏信息
MySQL EXPLAIN的Extra字段:深入解析查询优化的隐藏信息 引言 在MySQL的EXPLAIN输出中,Extra字段提供了关于查询执行计划的额外信息。这些信息对于理解查询的内部工作机制和优化查询性能至关重要。本文将详细解析Extra字段中常见的几个关键指标…...
Jenkins持续部署
开发环境任务的代码只要有更新,Jenkins会自动获取新的代码并运行 1. pycharm和git本地集成 获取到下面的 Git可执行文件路径 2. pycharm和gitee远程仓库集成 先在pycharm中安装gitee插件 在设置中找到gitee,点击添加账户,并将自己的账户添…...
橙单前端项目下载编译遇到的问题与解决
今天下载orange-admin前端项目,不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误,如下: 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了,可能是原作者…...
在android中怎么处理后端返回列表中包含图片id,如何将列表中的图片id转化成url
在 Android 中实现从包含图片 ID 的列表获取实际图片 URL 并显示图片,你可以使用以下步骤: 定义数据模型:创建一个 Java 或 Kotlin 类来表示列表中的对象。 网络请求:使用 Retrofit 或其他网络库来获取图片 URL。 异步处理:使用 AsyncTask、RxJava 或 Kotlin 协程来处理网…...
IM聊天代码
客户端 Headers inet inet.h #pragma once #include<Winsock2.h>//#pragma comment(lib,"Ws2_32.lib")class INetMediator; class INet { public:INet(){}virtual ~INet(){}//初始化网络virtual bool initNet() 0;//接收数据virtual void recvData() 0;…...
【Go - context 速览,场景与用法】
作用 context字面意思上下文,用于关联管理上下文,具体有如下几个作用 取消信号传递:可以用来传递取消信号,让一个正在执行的函数知道它应该提前终止。超时控制:可以设定一个超时时间,自动取消超过执行时间…...
Linus: vim编辑器的使用,快捷键及配置等周边知识详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 vim的安装创建新用户 adduser 用户名Linus是个多用户的操作系统是否有创建用户的权限查看当前用户身份:whoami** 怎么创建设置密码passwdsudo提权(sudo输入的是用户…...
数仓作业延时告警-基于关键路径预推
简介 作业延时告警,通常来说有两种方式: 其一,当作业到目标时间点还没完成触发告警;这类情况,对于目标作业而言,延时已经触发了,风险相对较大;有的是监控接口延时(raw层…...
秋招复习笔记——八股文部分:网络TCP
TCP 三次握手和四次挥手 TCP 基本认识 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号…...
麒麟桌面操作系统上配置Samba
原文链接:麒麟桌面操作系统上配置Samba Hello,大家好啊!今天给大家带来一篇关于在麒麟桌面操作系统上配置Samba的文章。Samba是一种免费的软件,实现了SMB/CIFS网络协议,使得Linux和Windows系统之间可以共享文件和打印机…...
【Go】探索 Go 语言的内建函数 copy
山水间歌声回荡 回荡思念的滚烫 去年的家书两行 读来又热了眼眶 云水边静沐暖阳 烟波里久违的故乡 别来无恙 你在心上 🎵 张靓颖/张杰《燕归巢》 在 Go 语言中,copy 是一个用于在切片之间复制元素的内建函数。它提供了一种简单而高…...
【React】JSX:从基础语法到高级用法的深入解析
文章目录 一、什么是 JSX?1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…...
JMeter 使用
1.JMeter 是什么? JMeter 是一款广泛使用的开源性能测试工具,由 Apache 软件基金会维护。它主要用于测试 Web 应用程序的负载能力和性能,但也支持其他类型的测试,如数据库、FTP、JMS、LDAP、SOAP web services 等。 2.特点&#x…...
20240724----安装git和配置git的环境变量/如何用命令git项目到本地idea
备注参考博客: 1)可以参考博客,用git把项目git到本地 2)可以参考博客vcs没有git 3)git版本更新,覆盖安装 (一)安装git (1)官网下载的链接 https://git-scm.com/downlo…...
JavaScript实战 - 用Canvas画一个心形
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问或建议,请私信或评论留言! 前言: 如…...
vim gcc
vim 使用 vs filename 分屏 ctrl ww 切窗口 shift zz 快速提出vim vim配置 vim启动时自动读取当前用户的家目录的.vimrc文件 vim配置只影响本用户 其他用户观看同一文件不受影响 gcc指令 & c文件编译过程 动态库 静态库 & 链接方式 有相应库才能进行…...
Symfony 表单构建器:创建和管理表单的最佳实践
Symfony 表单构建器:创建和管理表单的最佳实践 Symfony 是一个流行的 PHP 框架,以其强大的功能和灵活性闻名。表单构建器是 Symfony 中一个非常重要的组件,它提供了简单且高效的方式来创建和管理表单。本文将详细介绍 Symfony 表单构建器的最…...
Intel电脑CPU的选择
酷睿 i5/i7/i9 系列至强 Xeon 系列应用场景家用消费级电脑企业服务器工作站PCIe通道数 16X 最多识别到2张显卡,且每张降速为8X 64X 最多支持8张显卡同时使用 内存信道2通道8通道内存容量最大128GB最大6TB工作时长不建议长期不间断连续使用专为365*24不断电使用而设…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
