训练RGB+深度输入的分类器时损失函数报错AttributeError: 'list'对象无size属性
报错根因
AttributeError: 'list' object has no attribute 'size'触发的原因是你调用BCEWithLogitsLoss计算损失时,传入的输入参数或者目标参数是Python列表类型,不是PyTorch张量,损失函数内部调用.size()做尺寸校验时失败。
问题排查方向
- 检查你的backbone网络输出:很多特征提取、分割类网络会返回多尺度输出组成的列表,而不是单张预测张量。你可以在
sal_output = backbone(sal_input)后新增打印代码确认类型:
print(type(sal_output), isinstance(sal_output, list), len(sal_output) if isinstance(sal_output, list) else sal_output.shape)
如果确认是列表,取你需要用来计算损失的对应张量即可,比如取第一个输出:sal_output = sal_output[0]
- 检查你的数据集加载逻辑:确认
train_loader返回的sal_label是否为PyTorch张量,如果数据集的__getitem__方法直接返回了列表类型的标签,需要手动转换为张量:sal_label = torch.tensor(sal_label, dtype=torch.float32)
额外注意事项
你当前代码里多模态输入的拼接维度存在错误:sal_input = torch.cat((sal_image, sal_depth), dim=0)是在批次维度拼接,会导致输入的批次大小变为原来的2倍,后续即使类型问题修复,也会出现输出和标签批次尺寸不匹配的报错。拼接RGB和深度这类多模态输入应该在通道维度拼接,修改为:
sal_input = torch.cat((sal_image, sal_depth), dim=1)
内容的提问来源于stack exchange,提问作者Samra Kanwal
相关产品推荐
相关产品推荐

