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不断电使用而设…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...