PIDnet训练自己数据集避坑之:RuntimeError: weight tensor should be defined either for all or no classes

关于数据集格式可以看我的上一篇博客


PIDnet自己的数据集制作好后,当开始训练有可能会报错(我发现好多人都会有这个错)

RuntimeError: weight tensor should be defined either for all or no classes

或者是

IndexError: index -1 is out of bounds for dimension 0 with size 0

当我们去网上搜索的时候,一般会说pred 张量的大小为 0,这意味着在尝试访问 pred 张量中的元素时,代码试图访问一个无效的索引。

具体来看,我们有几个要查看的地方:

一、类别数问题

我们要确保权重张量的大小与类别数一致,假如你有 10 个类别,那么权重张量的形状应该是 [10]。在PV.py文件下找到下面这段代码,更改里面的类别数,假如说只有一类(不包括背景),那么就是{0:0,1:1},如果是两类(不包括背景),那就是{0:0,1:1,2:2}

关于self.class_weights的数值需要计算参考上面博客

        self.label_mapping = {0:0, 1:1}
        self.class_weights = torch.FloatTensor([0.99521856,1.00478144]).cuda()

二、数据集命名问题

debug代码的时候会发现criterion.py文件中以及utils.py文件中的的代码会报错,是关于self.min_kept 的值可能不适合当前的上下文,导致其值大于 pred 的元素数量的问题。

其实就是数据集命名的问题,你要确保你的图片命名是从数字0开始的,依次往下命名。

如果你是从数字1开始的,那么最后一张图片的数字就会超过数组索引的范围,这个方法是最快的,比去修改criterion.py和utils.py的代码好得多,本人亲测有效!也是大多数人报错IndexError: index -1 is out of bounds for dimension 0 with size 0的主要问题!希望大家能够尽快解决问题!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值