MMSeg搭建模型的坑

在MMSeg模型搭建时遇到Input type与weight type不匹配及未使用参数错误。问题源于部分模型未加载到CUDA,初始化不当,以及在DDP中未参与loss计算的参数。解决方案包括在DistributedDataParallel中启用未使用参数检测,确保所有forward输出参与计算损失,或注释掉未使用的模块。检查方法包括检查模型初始化和损失函数的参与情况。
摘要由CSDN通过智能技术生成

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)

在这里插入图片描述

使用mmseg训练自己的数据集需要进行以下步骤: 1. 准备数据集:将自己的数据集准备好,并按照mmseg的要求进行组织和标注。 2. 修改配置文件:根据自己的数据集,修改mmseg的配置文件,包括数据路径、类别数、颜色映射等。 3. 修改数据集文件:根据自己的数据集,修改mmseg的数据集文件,包括数据路径、类别数、颜色映射等。 4. 编译代码:在修改完配置文件和数据集文件后,需要重新编译mmseg的代码,以使修改生效。 5. 训练模型使用mmseg提供的训练命令,对自己的数据集进行训练。 下面是一个示例,演示了如何使用mmseg训练自己的数据集: 1. 准备数据集:将自己的数据集准备好,并按照mmseg的要求进行组织和标注。 2. 修改配置文件:打开mmseg的配置文件,例如`config.py`,找到数据路径的配置项,将其修改为自己的数据集路径,例如: ```python dataset_type = 'CustomDataset' data_root = 'path/to/your/dataset' ``` 3. 修改数据集文件:打开mmseg的数据集文件,例如`custom_dataset.py`,根据自己的数据集修改类别数和颜色映射,例如: ```python classes = ('class1', 'class2', 'class3') palette = [[0, 0, 0], [255, 0, 0], [0, 255, 0]] ``` 4. 编译代码:在命令行中进入mmseg的根目录,执行以下命令重新编译代码: ```shell pip install -v -e . ``` 5. 训练模型使用mmseg提供的训练命令,对自己的数据集进行训练,例如: ```shell python tools/train.py <config_file> --work-dir <output_dir> ``` 其中,`<config_file>`是修改后的配置文件路径,`<output_dir>`是训练模型的输出目录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weightOneMillion

感谢未来的亿万富翁捧个钱场~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值