车辆重识别代码笔记12.19
1、resnet_ibn_a和resnet网络的区别
ResNet-IBN-A 是在 ResNet 基础上进行了一些改进的变种,具体来说,它引入了 Instance Batch Normalization (IBN) 的概念,这在某些任务中(如图像识别、迁移学习等)有显著的性能提升。下面是 ResNet-IBN-A 和 标准ResNet 之间的主要区别:
1. Instance Batch Normalization (IBN)实例批量归一化
-
标准ResNet 使用传统的 Batch Normalization (BN) 来进行归一化处理。BN是将每一层的输出按照批次维度进行归一化,这对于大多数任务表现良好,但在某些情况下,尤其是当批次大小较小或在不同域之间迁移时,可能会遇到问题。
-
ResNet-IBN-A 引入了 Instance Batch Normalization (IBN),即同时使用 Instance Normalization (IN) 和 Batch Normalization (BN) 来处理不同的特征。具体来说,IBN-A 会将输入特征图分成两部分:
-
一部分使用 Instance Normalization(通常用于样式迁移任务等,基于每个样本的归一化)。
-
另一部分使用 Batch Normalization(通常用于图像分类任务,基于整个批次的归一化)。
这种设计的目的是结合 Instance Normalization 和 Batch Normalization 的优点,能够更好地处理多样化的特征表示,尤其是在跨领域迁移学习和 无监督学习 等任务中表现出色。
-
Instance Normalization (IN):实例标准化(IN):
-
IN 是在每个样本内进行归一化,常见于图像风格迁移中,能够去除图像中的统计特性(如风格信息)。
Batch Normalization (BN):批量归一化(BN):
-
BN 是基于整个批次的统计信息进行归一化,常用于提高深度网络的训练稳定性和加速收敛。
在 ResNet-IBN-A 中,IBN 层会把特征图分成两部分:
-
其中一部分使用 Instance Normalization 来处理。
-
另一部分使用 Batch Normalization 来处理。
2. 改进的网络结构
-
ResNet-IBN-A 在网络结构的设计上与 ResNet 保持高度一致,只是在网络的部分卷积层中引入了 IBN 层。
-
ResNet-IBN-A 的每个残差块(Bottleneck)中会对卷积输出进行 IBN 处理,通常是添加在 ReLU 激活函数前后。IBN 层的作用是帮助网络更好地适应图像的域变化(例如,在处理风格迁移任务或者迁移学习任务时),从而增强网络的泛化能力。
3. 性能差异
-
在 标准ResNet 上,使用 Batch Normalization 可以显著加速训练并稳定学习过程,但在某些任务中(尤其是风格迁移、图像生成等任务)可能会出现过拟合或者迁移学习性能较差的情况。
-
ResNet-IBN-A 通过引入 Instance Batch Normalization,使得网络在多个任务和领域上有更强的表现,特别是在 域适应、风格迁移、小样本学习 或者 跨领域迁移学习 中,它能显著提高模型的性能和泛化能力。
4. 适用任务
-
ResNet 通常用于图像分类、目标检测等任务,在这些任务上表现已经非常好。
-
ResNet-IBN-A 更适用于需要跨领域迁移学习、无监督学习、风格迁移等任务。通过 IBN 结构,它能够在多域任务中提供更强的适应性和性能,尤其在处理复杂的视觉变化时(如图像风格或领域不同的图片)。
5. 具体改进的实现
ResNet-IBN-A 在每个Bottleneck层中的卷积操作后插入了 IBN 层。具体来说,假设你有一个ResNet的基础架构,你可以通过以下步骤将其改为 ResNet-IBN-A:
-
将原来每个残差块中的 Batch Normalization 替换为 Instance Batch Normalization (IBN)。
-
IBN 会将每个卷积输出的特征图分为两部分,并分别进行 Instance Normalization 和 Batch Normalization 处理。
总结:
-
ResNet-IBN-A 和 标准ResNet 的主要区别在于引入了 Instance Batch Normalization (IBN),这一设计通过结合 Instance Normalization 和 Batch Normalization 的优点,提高了网络在跨域任务、迁移学习、无监督学习和风格迁移等方面的表现。
-
标准ResNet 更适合传统的图像分类任务,而 ResNet-IBN-A 更适合在多样化或复杂环境中进行训练,尤其在不同的视觉领域间迁移时具有优势。
2、 def load_param(self, model_path):
-
load_param函数的目的是从预训练模型中加载除全连接层之外的其他层的参数,并将这些参数复制到当前模型中。全连接层的参数会被跳过,因此该函数通常用于迁移学习,其中我们希望加载卷积层的预训练参数,而重新训练全连接层。 -
具体操作:
-
使用
torch.load(model_path)加载模型参数。 -
遍历加载的参数字典。
-
对于每一个参数,检查其名称是否包含
'fc',如果是全连接层则跳过。 -
对于非全连接层的参数,将其值复制到当前模型中对应的层。
-
该方法适用于模型的迁移学习任务,尤其是在进行特定任务的微调(fine-tuning)时,通常会加载预训练模型的卷积层权重,而重新初始化最后的全连接层以适应新的分类任务。
3、 def freeze_backbone(self):
定义了一个名为 freeze_backbone 的方法,主要功能是 冻结 网络的 backbone 部分的参数,使得这些部分的参数在训练过程中不更新。通常在迁移学习中,冻结特定层(如卷积层)可以加速训练,并避免对已经学到的特征进行破坏,尤其是当我们只对网络的最后几层进行微调时。
这些层和模块通常负责提取输入图像的特征,因此在迁移学习中,backbone 部分通常在训练过程中保持不变(冻结),只训练网络的最后几层(例如分类层)来适应新任务。
param.requires_grad = False:通过设置 param.requires_grad 为 False,使得这些参数在训练过程中不计算梯度,也就是说它们的值不会在反向传播过程中更新。具体来说:
-
requires_grad是一个布尔值,当为True时,表示需要计算该参数的梯度(即该参数是可训练的),当为False时,表示该参数不参与梯度计算(即该参数被冻结,训练时不会更新)。
4、代码
if self.neck == 'no':self.classifier = nn.Linear(self.in_planes, self.num_classes) # 池化后的通道数为2048,FC的输出为类别数量# self.classifier = nn.Linear(self.in_planes, self.num_classes, bias=False) # new add by luo# self.classifier.apply(weights_init_classifier) # new add by luoelif self.neck == 'bnneck':self.bottleneck = nn.BatchNorm1d(self.in_planes)#禁用批量归一化层中的偏置项(bias)。#requires_grad_(False) 表示偏置项的梯度不再参与反向传播,即在训练过程中该偏置项不会更新。self.bottleneck.bias.requires_grad_(False) # no shiftself.classifier = nn.Linear(self.in_planes, self.num_classes, bias=False)
这段代码根据 neck 的值来选择不同的分类器设计:
-
neck == 'no':直接将池化后的特征通过一个简单的全连接层进行分类,没有任何额外的处理。适用于模型较简单的情况,不需要额外的特征转换或标准化。 -
neck == 'bnneck':在分类之前添加了一个批量归一化层BatchNorm1d,用于对输入特征进行标准化处理,以提高训练稳定性并加速训练。批量归一化帮助缓解梯度消失或爆炸的问题,也能减少对权重初始化的敏感度。
neck 的作用:
-
'no':不使用额外的处理,只是一个简单的全连接层。 -
'bnneck':在全连接层之前增加了批量归一化层,通常用于改善训练的稳定性和加速收敛。
这种方式常见于深度学习中的 迁移学习 或 特征提取 任务,特别是当网络的最后几层需要根据不同任务进行微调时。
5、self.training
在 PyTorch 中,self.training 是一个由 PyTorch 内部自动管理的布尔值,用于指示模型当前是否处于训练模式。这个属性属于 nn.Module 类,是每个模型实例(即继承自 nn.Module 的模型)自动提供的。你可以直接通过 self.training 来检查当前模型是处于训练模式(True)还是推理模式(False)。
工作原理
1. self.training 的自动管理
-
训练模式:当你调用
model.train()时,self.training会自动设置为True,表示模型处于训练模式。 -
推理模式:当你调用
model.eval()时,self.training会自动设置为False,表示模型处于推理模式。
self.training 是 PyTorch 为了方便区分训练和推理模式而设计的。通过该属性,你可以在 forward 方法中根据模型的状态来调整行为(例如启用或禁用 Dropout)。
相关文章:
车辆重识别代码笔记12.19
1、resnet_ibn_a和resnet网络的区别 ResNet-IBN-A 是在 ResNet 基础上进行了一些改进的变种,具体来说,它引入了 Instance Batch Normalization (IBN) 的概念,这在某些任务中(如图像识别、迁移学习等)有显著的性能提升。…...
linux内核网络分层概述
在开发应用时,我们使用 socket 实现网络数据的收发。以tcp为例,server端通过 socket, bind, listen来创建服务端,然后通过 accept接收客户端连接;客户端通过 socket和 connect系统调用来创建客户端。用于数据收发的系统调用包括 s…...
H3C交换机配置 telnet 服务
使用一个交换机做成 telnet 服务, telnet 可以使用指定端口开启三层交换机, 用于与 pc 互通, 也可以使用自带的 vlan1 设置 ip 然后达到互通, 因为华三的交换机端口默认是 access 口, 默认带 vlan1 , 直接设置 vlan1 的 ip 也就可以实现互通 实现互通 互通的两种方式 设置 vl…...
江苏计算机专转本 技能Mysql知识点总结(二)
三、SQL数据操纵语言(增删改查) 1.insert 语句(增) INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3); 2.Delete 语句(删) //1. DELETE FROM 表名 WHERE 条件;//2. truncate table 表名; …...
边缘智能网关助力打造建筑智慧消防物联网
随着经济社会的快速发展,为了满足民众生产、生活、消费需求,高层建筑、大型综合连体建筑持续兴建,各类火灾风险和事故也越发增加。得益于物联网的普及应用,消防监测和管理迎来数字化、智慧化转型升级。 针对各类高层、大型建筑消防…...
学习Cookie 提升
目录 Cookie 的覆盖 Cookie下的path 特点 设置Cookie 路径 实例 Cookie的最大存活时间 设置Cookie 存活时间 实例 Cookie 和session的区别 和联系 Cookie 的覆盖 当 key相同 和只要path的上级目录的路径相同,就可以被替换掉 value 值 如下图…...
OpenAI 发布会 9 天技术总结
OPEN AI 发布会总结 OpenAI 发布会 12 天技术总结Day 1: 开幕与愿景主要内容:体验方式: Day 2: GPT-4 及其突破性进展主要内容:体验方式: Day 3: GPT-4 在编程领域的突破 - Codex & Copilot主要内容:体验方式&…...
免费注册.news域名一年(今日有效)
时间紧迫,就不上图了,需要的尽快。 网址:https://www.namecheap.com/ 优惠码:FREEDOM24...
解决JIRA、Confluence用户自动注销、反复登录的问题
一、问题描述:当工作从从confluence里面打开jira的时候,在回到confluence时候,就自动退出了,需要账号密码登录重复登录,使人十分厌恶。 二、原因分析: 访问 JIRA、Confluence 或任何其他具有相同域或 IP 上…...
Oracle创建逻辑目录
Oracle 在执行逻辑备份及还原时,需要用到逻辑目录。 本文就来简单介绍一下逻辑目录相关的操作,希望对大家有所帮助。 1.登录到Oracle数据库 使用具有足够权限的数据库用户登录到Oracle数据库。通常,这需要是管理员账号,如SYS…...
【AIGC-ChatGPT进阶副业提示词】星际占卜师:探索星象能量的艺术【限时免费阅读,一天之后自动进入进阶课程】
引言 在这个数字化的时代,我们创造了一个独特的角色 —— 星际占卜师。这不仅是一个简单的运势预测工具,更是一个融合了玄学、预言和能量解读的智能向导。通过精心设计的系统提示词和独特的画境生成机制,星际占卜师能够为用户带来沉浸式的占…...
泷羽sec-shell编程(9)
shell(9) 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他…...
【Vue-4小时速通01-ES6】
1.var和let的区别 1.1作用域与有效范围 var 在函数或全局作用域中声明变量,无论在块级作用域内外都可以访问。 var 即使在块级作用域外部访问,仍然能获取到结果。 let 在块级作用域内声明变量,仅在其所在的作用域中有效。 let 如果在作用域…...
基于STM32的智能仓储环境监测的Proteus仿真
文章目录 一、智能仓储环境监测1.题目要求2.思路3.电路仿真3.1 未仿真时3.2 开始仿真,显示屏显示Init后,正常显示温度湿度光照烟雾数值3.3 切换温度阈值界面,用阈值加减设置温度min和温度max阈值3.4 调整温度数值,触发风扇/加热3.…...
logback日志控制台打印与写入文件
1.创建logback-spring.xml文件放入resource下 <?xml version"1.0" encoding"UTF-8"?> <configuration><property name"LOG_CONTEXT_NAME" value"log"/><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用…...
成方金融科技后端部分笔试题 - 解析
单选题 1.以下关于JAVA自动类型转换,描述错误的是哪一项?(B) A.byte->short B.char->short C.char->int D.float->double 2.请选择运行以下代码后,系统显示的内容什么?(B) public class Test {static {int x1;}static int x,y;publ…...
WatchAlert - 开源多数据源告警引擎
概述 在现代 IT 环境中,监控和告警是确保系统稳定性和可靠性的关键环节。然而,随着业务规模的扩大和数据源的多样化,传统的单一数据源告警系统已经无法满足复杂的需求。为了解决这一问题,我开发了一个开源的多数据源告警引擎——…...
Linux procps-ng 包详解
简介 procps-ng 包是用于监视和管理 Linux 上的进程和系统性能的实用程序集合。它与 /proc 文件系统交互以检索实时系统信息。procps-ng 中的实用程序包括 ps、top、free、uptime 等命令。 安装 procps-ng 使用包管理工具安装 Debian/Ubuntu sudo apt update sudo apt ins…...
[react] <NavLink>自带激活属性
NavLink v6.28.0 | React Router 点谁谁就带上类名 当然类名也是可以自定义 <NavLinkto{item.link}className{({ isActive }) > (isActive ? 测试 : )}>{item.title}</NavLink> 有什么用?他会监听你的路由,刷新的话也会带上激活效果...
智能语音识别模块与声音传感器模块对比分析:原理、优缺点、性价比与应用领域
随着物联网(IoT)和智能家居的发展,智能设备的控制方式越来越多样化,尤其是语音控制和声音感应控制。智能语音识别模块和声音传感器模块作为两种常见的音频输入设备,它们在不同的应用场景中发挥着重要作用。本文将深入分…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
