当前位置: 首页 > news >正文

pytorch冻结参数训练的坑

由于项目需要训练一个主干网络接多个分支的模型,所以先训练一个主干网络加第一个分支,再用另外的数据训练第二个分支,训练的过程中需要冻结主干网络部分,后面的分支训练过程也一样需要冻结主干网络部分。

冻结模型的方式

for name, para in model.named_parameters():# 冻结backbone的权重if name.split(".")[0] == "backbone":para.requires_grad = False        # 或者用para.requires_grad_(False),一个是通过属性直接赋值,一个是通过函数赋值else:para.requires_grad = True
# 可以打印需要更新梯度的参数
for name, value in model.named_parameters():print(name, "\t更新梯度:",value.requires_grad)

坑1:这样做并不能冻结batchnorm层的参数,所以需要在训练中手动冻结。如:

def fix_bn(m):classname = m.__class__.__name__if classname.find('SyncBatchNorm') != -1 or classname.find('InstanceNorm2d') != -1 or classname.find('BatchNorm2d') != -1:          #SyncBatchNorm, InstanceNorm2dif m.num_features in [32, 64, 96, 128, 256, 384, 768, 192, 1152, 224]:      # 需要冻结的BN层的通道数m.eval()def train():for epoch in range(max_epoch):model.train()if args.freeze:model.apply(fix_bn)model.backbone[5][0].block[0][1].eval()   # 假如需要冻结的BN层通道数和不需要冻结的BN层通道数一样,则需要单独写for batch_idx, (data, target) in enumerate(train_loader):...

坑2:用了冻结训练(freeze)就不要用EMA方式更新模型了,不然收敛缓慢不说,还会造成前面冻结的参数产生变化,可以从EMA的代码看出端倪:

class EMA:def __init__(self, model, decay=0.9999):super().__init__()import copyself.decay = decayself.model = copy.deepcopy(model)self.model.eval()def update_fn(self, model, fn):with torch.no_grad():e_std = self.model.state_dict().values()#m_std = model.module.state_dict().values()   # multi-gpum_std = model.state_dict().values()          # single-gpufor e, m in zip(e_std, m_std):e.copy_(fn(e, m))def update(self, model):self.update_fn(model, fn=lambda e, m: self.decay * e + (1. - self.decay) * m)

可以看出EMA的方式更新模型方式,大部分是结合上一个模型的参数的,即:

model_update = decay*model(t-1) + (1-decay)*model(t)       # model(t-1) 代表上一次迭代模型的参数,model(t)代表当前迭代得到的模型参数

虽然冻结了backbone的参数,阻止了梯度在backbone中反向传播,但参数由于经过如上乘法及加法运算,由于精度原因,还是会发生微小变化,虽然训练次数增加,这个变化会扩大,从而达不到冻结训练的效果。而且从计算公式可以看出来,采用EMA的方式更新模型参数,参数会更新得很慢,会造成网络难以学习的“错觉”。我在这里困住了3天,有怀疑过是否是网络设计问题,是否是多GPU同步的问题,是否是参数设置,如学习率过小,权重衰减过大,或者dropout设置过大等等,最终一步一步排除定位到EMA的问题。
以这次的经验来看,EMA只适合在上一次训练得到模型的基础上,这一次加了额外的数据,需要在上一次的基础上做微调的情况。

相关文章:

pytorch冻结参数训练的坑

由于项目需要训练一个主干网络接多个分支的模型,所以先训练一个主干网络加第一个分支,再用另外的数据训练第二个分支,训练的过程中需要冻结主干网络部分,后面的分支训练过程也一样需要冻结主干网络部分。 冻结模型的方式 for nam…...

P1827 [USACO3.4] 美国血统 American Heritage(前序 + 中序 生成后序)

P1827 [USACO3.4] 美国血统 American Heritage(前序 中序 生成后序) 一、前言 二叉树入门题。涉及到树的基本知识、树的结构、树的生成。 本文从会从结构,到完成到,优化。 二、基础知识 Ⅰ、二叉树的遍历 前序遍历&#xff…...

【四、centOS安装docker】

安装docker sudo yum install -y yum-utils device-mapper-persistent-data lvm2 如果以上报错 备份系统自带yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup进入 /etc/yum.repos.d cd /etc/yum.repos.d删除文件 rm -f *.r…...

想学嵌入式开发,薪资怎么样?

想学嵌入式开发,薪资怎么样? 对于嵌入式工程师来说呢,它重点学习内容就是首先一定要打好基础,如果从编程语言角度来讲,那么可以在语言上选C或者C,你可以选择其中任何一门语言作为你的入门。 最近很多小伙伴…...

SQL死锁进程内容查询语句

1.方式1 SELECT object_name(A.resource_associated_entity_id) as TABLENAME, A.request_session_id AS SPID,DB_NAME(B.dbid) AS DBName,B.blocked,B.dbid,B.program_name,B.waitresource,B.lastwaittype,B.loginame,B.hostname,B.login_time,B.last_batch--,B.* FROM sy…...

Ubuntu 20.04中Nightingale二进制部署

参考博客《【夜莺监控】初识夜莺,强!》 lsb_release -r可以看到操作系统版本是20.04,uname -r可以看到内核版本是5.5.19。 sudo apt-get update进行更新镜像源。 完成之后,如下图: sudo apt-get upgrade更新软件…...

深入探讨Java面试中内存泄漏:如何识别、预防和解决

引言 在编写和维护Java应用程序时,内存泄漏是一个重要的问题,可能导致性能下降和不稳定性。本文将介绍内存泄漏的概念,为什么它在Java应用程序中如此重要,并明确本文的目标,即识别、预防和解决内存泄漏问题。 内存泄…...

win10 安装.net framework 3.5,错误代码0x8024401C

win10 安装.net framework 3.5,错误代码0x8024401C 参考链接:https://www.gxlsystem.com/diannaowenti-386775.html 解决方法如下,cmd中执行: net stop wuauserv reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\W…...

杂记 | Langchain中few-shot提示词模板的使用(给提示词添加示例)

文章目录 01 普通的提示词模板02 few-shot提示词模板 Langchain是一个集成多个大语言模型的开源框架,可以使用它来快速开发大语言模型应用。 本文的代码使用到的模块: from typing import List, Dict from langchain import PromptTemplate, FewShotPr…...

SVN -基础

SVN - 基础 概念操作步骤开发实际经验 概念 带SVN路径 有隐藏文件,记录repo的一些信息,与repo进行关联,可以与repo进行同步 不带SVN路径 只是单纯的文件,与repo独立 操作步骤 checkout 具有路径 URLcheckout dir 输出目标文件夹…...

MySQL基础终端命令与Python简单操作MySQL

文章目录 MySQL终端命令1. 进入mysql2. 创建数据库3. 选择数据库4. 创建数据表1. 主键约束2. 外键约束3. 非空约束4. 唯一约束5. 使用默认约束6. 设置id为自增列 5. 查看数据表6. 修改数据表1. 修改表名2. 修改表的字段类型3. 修改表的字段名4. 为表添加字段5. 删除字段6. 调整…...

编译原理.龙书学习1

第一章: 编译器:将程序翻译成一种能够被计算机执行的形式 解释器:解释器直接利用用户提供的输入执行源程序中指定的操作 一个编译器的结构 编译器将源程序映射为语义上等价的目标程序,这个映射过程由两部分组成:分析…...

anaconda安装完成之后输入conda -V没有反应

anaconda安装完成后,conda没有反应 vim ~/.bashrc后面添加内容 # added by Anaconda3 5.3.0 installer # >>> conda init >>> # !! Contents within this block are managed by conda init !! __conda_setup"$(CONDA_REPORT_ERRORSfalse /u…...

netty报文解析之粘包半包问题

粘包问题 Netty 的粘包问题是指在网络传输过程中,由于 TCP 协议本身的特点,导致发送方发送的若干个小数据包被接收方合并成了一个大数据包。这种情况称为粘包。 TCP 协议是面向流的协议,没有数据边界,发送方发送的数据可能会被分…...

EasyCode整合mybatis-plus的配置

文章目录 entitymapper.javamapper.xmlserviceserviceImplcontroller 这篇文章不教你如何安装和使用EasyCode,只是贴出可以使用的配置。 具体EasyCode的使用可以查看其它的文章。 entity ##导入宏定义 $!{define.vm}##保存文件(宏定义) #sa…...

实施预测性维护解决方案的挑战及PreMaint的应对方法

前面我们介绍了企业选择预测性维护解决方案的常见问题和PreMaint的策略,本期我们将带来实施过程中可能会遇到的挑战,以及如何通过PreMaint来应对这些挑战,以实现可靠的预测性维护。 随着工业技术的不断进步,预测性维护作为一种先进…...

1. js中let、var、const定义变量区别与方式

1 声明语法 var upperA A; let upperB B; const upperC C; 只声明不初始化的结果,【 const定义的常量不可以修改,而且必须初始化】 // var 声明变量 var upperA; console.log(打印大写的A:%s, upperA); // 结果:打印大写的A&am…...

【STM32学习】I2C通信协议 | OLED屏

🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言:你只管努力,剩下的交给时间! 今天需要将代码烧录到开发板中,本喵默认大家都会创建工程,以及进行基本的…...

Nvme Spec 第一章节学习

Nvme Express Base Specification 第一章 简介 1.1概述 NVM ExpressTM(NVMeTM)接口允许主机软件与非易失性存储器子系统通信。 此接口针对企业和客户端固态驱动器进行了优化,通常作为寄存器级接口连接到PCI Express接口。 注:在…...

第一章:最新版零基础学习 PYTHON 教程(第九节 - Python 语句中的 – 多行语句)

Python 中的语句: 在Python中,语句是Python解释器可以读取和执行的逻辑命令。它可能是Python 中的赋值语句或表达式。 Python 中的多行语句: 在Python中,语句通常写成一行,每行的最后一个字符是换行符。要将语句扩展到一行或多行,我们可以使用大括号 {}、圆括号 ()、方…...

Java 面试手撕排序封神版!八大排序算法(快排 / 堆排 / 归并)手敲无 bug,面试直接默写

面试手撕排序整理完整版 面试中常考的手撕排序算法整理&#xff0c;可以直接照抄&#xff0c;包含 快速排序归并排序堆排序希尔排序直接插入排序选择排序计数排序冒泡排序 快速排序 丐版实现 public static void quickSort(ArrayList<Integer> arr, int begin, int end){…...

软件报告管理化的信息汇总与呈现

在数字化浪潮席卷全球的今天&#xff0c;企业每天产生的数据量呈指数级增长。如何高效汇总、分析并呈现这些数据&#xff0c;成为提升决策效率的关键。软件报告管理化应运而生&#xff0c;它通过系统化的信息整合与可视化呈现&#xff0c;将海量数据转化为清晰、直观的决策依据…...

别再只懂Git了!SVN服务器在2024年的企业内网部署与权限配置实战指南

2024年企业内网SVN服务器部署与权限管控实战手册 金融行业的代码仓库最近遭遇了一次未授权访问事件——某核心业务系统的配置文件被开发人员误传至公开目录&#xff0c;导致敏感信息暴露。事后审计发现&#xff0c;该企业使用的分布式版本控制系统无法精确控制目录级权限。这正…...

New API:企业级AI模型统一网关的终极解决方案

New API&#xff1a;企业级AI模型统一网关的终极解决方案 【免费下载链接】new-api A unified AI model hub for aggregation & distribution. It supports cross-converting various LLMs into OpenAI-compatible, Claude-compatible, or Gemini-compatible formats. A ce…...

企业级Nacos定制全攻略:从logo替换到服务地址穿透的完整解决方案

企业级Nacos深度定制实战&#xff1a;打造专属服务发现平台 在数字化转型浪潮中&#xff0c;服务发现组件已成为现代微服务架构的核心基础设施。作为阿里巴巴开源的明星项目&#xff0c;Nacos凭借其服务发现、配置管理和服务治理三位一体的能力&#xff0c;正逐步取代Eureka成…...

基于单片机的智能泡茶机设计(有完整资料)

资料查找方式&#xff1a;特纳斯电子&#xff08;电子校园网&#xff09;&#xff1a;搜索下面编号即可编号&#xff1a;T1172310M设计简介&#xff1a;吧电源&#xff1a; 5V 传感器&#xff1a;温度传感器&#xff08;DS18B20&#xff09;、水位传感器&#xff08;Water Sens…...

盟接之桥说制造:撕开实际成本核算的“遮羞布”,别让管理漏洞吞噬你的利润

在制造业的江湖里&#xff0c;流传着一个关于成本核算的“神话”&#xff1a;似乎只要搞一套ERP系统&#xff0c;设定好材料、人工、费用的分摊规则&#xff0c;按下计算按钮&#xff0c;精准的成本数据就会像自来水一样流出来。很多老板和财务负责人天真地以为&#xff0c;成本…...

让大模型帮你写完那些烦死人的脚本吧

你每天有多少时间是真正花在"想清楚要做什么"上面的&#xff1f;大部分时间&#xff0c;其实都在处理各种"中间层"的事情&#xff1a;写 Tcl/python脚本、整理 timing report……这些东西不是不重要&#xff0c;但它们只是"通往目标的路"&#x…...

邯郸市佳铭文化:Geo软文+社交媒体,解锁品牌传播新闭环

在2026年的营销版图中&#xff0c;品牌传播已从单一渠道的“单点爆破”演变为全平台协同的“系统作战”。邯郸市佳铭文化凭借对Geo&#xff08;生成式引擎优化&#xff09;技术与社交媒体生态的深度洞察&#xff0c;为企业打造了一套“内容精准触达用户情感共鸣”的传播闭环体系…...

突破百度网盘下载限速的技术方案:baidu-wangpan-parse深度解析

突破百度网盘下载限速的技术方案&#xff1a;baidu-wangpan-parse深度解析 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载速度而焦虑吗&#xff1f;我们…...