Error提示:
nll_loss2d_forward_kernel: block: [5,0,0], thread: [339,0,0] Assertion `t >= 0 && t < n_classes` failed.
而且奇怪的是,在训练中间断开:
| 39/101 [00:53<01:18, 1.27s/it]
代码细节:
数据都是统一处理的,算背景类,共有四类,使用min和max对target进行输出,tensor(0., device='cuda:0') , tensor(3., device='cuda:0'),代表对target的处理应该没有问题吧
按照网上所提示的,在文件头加入:
import os
os.environ['CUDA_LAUNCH_BLOCKING'] = '1'
从而获得更详细提示,得出错误在cross_entropy_loss = F.cross_entropy(student_output, labels.squeeze(1).long())这一句上,
对这一句进行测试:
labels_f = labels.squeeze(1).long()
print("标签的最小值:", labels_f.min().item())
print("标签的最大值:", labels_f.max().item())
print("标签的dtype:", labels_f.dtype)
assert labels_f.min() >= 0, "标签张量包含负值。"
assert labels_f.max() < student_output.size(1), f"标签张量的值超出了有效的类别范围 [0, {student_output.size(1)-1}]。"
assert labels_f.dtype == torch.long, "标签张量的类型必须是 LongTensor。"
cross_entropy_loss = F.cross_entropy(student_output, labels_f)
发现错误地方输出标签的最大值: 127.0
随后寻找label被错误赋值的地方:发现了,标签BUG! 我服了。
至此,已解决该问题,遇到了两次,第一次是类别设置错误,第二次发现标签有异常值。