修改PointNet++分割模型类别至17类后触发断言错误求助
问题分析与解决方案
核心错误根源
触发Assertion t >=0 && t <n_classes的本质是训练数据里的标签值超出了17类的合法范围——17类的标签索引应该是0~16,但你的数据中存在小于0或者大于等于17的标签,导致ClassNLLCriterion计算损失时触发断言。后面的CUDA Runtime Error是这个断言失败引发的连锁报错,根源不在feature_transform_reguliarzer的CUDA调用上。
排查修复步骤
- 检查数据集标签范围:遍历训练/验证数据的标签,统计所有标签值的分布,确认是否存在超出
0~16的数值。大概率是新增的4类标签没有正确映射到13~16区间,或者原13类标签转换时出现了偏移错误。 - 核对标签预处理逻辑:检查数据加载的
dataset类代码,确保所有标签都被正确归一化到0~16。比如原13类是0~12,新增的4类必须对应13~16,不能出现跳变或越界。 - 确保
num_classes全局一致:- 检查模型最后一层输出维度是否确实是17(比如最后一个卷积/全连接层的输出通道数)
- 确认损失函数的
num_classes参数同步设为17,部分自定义损失需要手动指定类别数 - 检查权重加载逻辑,确保新的17类权重完全覆盖旧参数,没有残留的13类维度数据
- CPU调试快速定位异常样本:临时把模型和数据切换到CPU训练,这样断言错误会抛出明确的Python级报错,直接指出哪个样本的标签出问题,方便快速定位。
临时调试代码示例
可以在数据加载的__getitem__方法里加标签校验:
def __getitem__(self, index): # 原数据加载逻辑 target = ... # 你的标签加载代码 # 新增标签检查 assert torch.all(target >= 0) and torch.all(target < 17), f"发现非法标签: {target}" return ...
内容的提问来源于stack exchange,提问作者sheng1_2
相关产品推荐
相关产品推荐

