MMSeg搭建模型的坑

ops/2024/10/18 16:55:40/

Input type(torch.suda.FloatTensor) and weight type (torch.FloatTensor) should be same

自己搭建模型的时候,经常会遇到二者不匹配,以这种情况为例,是因为部分模型没有加载到CUDA上面造成的。
在这里插入图片描述注意搭建模型的时候,所有层都应该在init函数中完成初始化
其次,对于List、Tuple这种类型,不建议直接用。
以下是错误代码,我搞了半天,不理解为什么总是不对,正确的应该是self.aspp = nn.ModuleList()

self.aspp = [] # 注意这里不能直接用list[]。类似元组,tuple[]也不能用,要不然会导致weight不在cuda上
for dilation in dilations:self.aspp.append(ConvModule(self.in_channels,self.channels,1 if dilation == 1 else 3,dilation=dilation,padding=0 if dilation == 1 else dilation,conv_cfg=self.conv_cfg,norm_cfg=self.norm_cfg,act_cfg=self.act_cfg))

搭建代码时,希望记住。没有系统教学,只能自己在网上摸索。

Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter detection by passing the keyword argument find_unused_parameters=True to torch.nn.parallel.DistributedDataParallel, and by making sure all forward function outputs participate in calculating loss.

多GPU的坑,翻译为

  • 在开始新的迭代之前,应已在上一次迭代中完成缩减。此错误表示您的模块具有未用于产生损失的参数。通过将关键字参数find_unused_parameters=True传递给torch.nn.parallel,可以启用未使用的参数检测。DistributedDataParallel,和
    确保所有“正向”函数输出都参与计算损失。
    关键在于
This error indicates that your module has parameters that were not used in producing loss. 

即有参数未参与到loss生成过程中,换句话说就是有参数在init中定义,但是未在forward中使用,就会造成这样的结果。原来为了不断调优模型,我将几个待选网络模块都写在了init函数中,然后这样只需要在forward中改变调用的模块就可以了。在单机运行中这样是可行的无错的,但是在DDP中由于需要多卡进行loss的reduce,为了防止出错,ddp就强行设置了这样的规则,但是可以通过如上错误提示里面的参数更改此设置,但是尽量不要修改。
解决方法:
可以通过 (1) 将关键字参数 find_unused_parameters=True 传递给 torch.nn.parallel.DistributedDataParallel 来启用未使用的参数检测;
(2) 确保所有 forward 函数的所有输出都参与计算损失。解决方法:将init函数中未使用到的模块注释掉即可。
一般推荐2,
因为我只修改了骨干网络,骨干网络是我自己创建的,仔细检查发现,复制粘贴的时候,有个地方忘记修改

 x = self.aspp2(x[3]) # 此处是aspp2,之前是aspp3

修改之后,就可以跑通了
拓展:
也有推荐用如下代码检查,我试了一下,但是将所有的都输出来了,不知道是不是放的位置不对:
在mmseg/models/segmentors/encoder_decoder.py中的losses.update(loss_decode)语句下加入下段代码

for name, p in self.decode_head.named_parameters():#  print(name)if p.grad is None:print(name)

在这里插入图片描述


http://www.ppmy.cn/ops/19433.html

相关文章

NIO之ByteBuffer

NIO中的ByteBuffer是缓冲区,其中有几个比较重要的属性capacity,position和limit。 capacity: 其中,capacity是缓冲区的容量大小,在分配内存空间后不会改变。 limit: limit是限制位置,在读写模…

Java 基础常见面试题整理

目录 1、java的基本数据类型有哪些?2、java为什么要有包装类型?3、String a "123" 和 String a new String("123") 区别?4、String、StringBuilder和StringBuffer的区别?5、如何理解面向对象和面向过程&…

移远通信再推系列高性能卫星、5G、GNSS及三合一组合天线

4月23日,全球领先的物联网整体解决方案供应商移远通信正式宣布,再次推出多款高性能天线产品,以进一步满足物联网市场对高品质天线产品的需求。 其中包括卫星天线YETN001L1A、三合一组合天线YEMA300QXA和YEMN302Q1A,外部5G天线YECN…

深入探讨负载均衡的原理及算法

在现代分布式系统中,负载均衡扮演着至关重要的角色。随着用户数量和流量的不断增长,单个服务器已经无法承担巨大的负载。因此,需要将负载分散到多个服务器上,以确保系统的高可用性、可扩展性和响应能力。负载均衡不仅可以提高系统的整体性能,还能够实现故障转移和灾难恢复,从而…

GPT与GAN结合生成图像——VQGAN原理解析

1、前言 这篇文章,我们讲VQ_GAN,这是一个将特征向量离散化的模型,其效果相当不错,搭配Transformer(GPT)或者CLIP使用,达到的效果在当时可谓是令人拍案叫绝! 原论文:Tam…

python之excel加工处理小案例一则

一、工具用途 工作中,需要对各类excel进行加工处理,当表和字段比较多时,关联条件又有多个,每次通过execl的vlookup之类的关联公式手工可以解决工作需求,但一般耗时较长,且人工统计匹配也存在出错的情况。 …

【漏洞复现】手机卡号推广商城 login.php接口处存在 SQL 注入漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

DRF学习之路由组件

一、路由的写法 1、原始写法 (1)介绍 是指手动编写路由规则的方式。使用path()函数或re_path()函数来定义路由规则,并将其与对应的视图函数或类关联起来。 (2)示例 假设有一个名为book的应用,它包含了…