linkenfaqiu / MMRAN

这是《Multitask Learning with Multiscale Residual Attention for Brain Tumor Segmentation and Classification》这篇文章的源代码。若要使用,请对data文件夹进行数据划分后,输入$python main.py train$
https://link.springer.com/article/10.1007/s11633-022-1392-6
7 stars 2 forks source link

operator(): block: [0,0,0], thread: [0,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && "index out of bounds"` failed #5

Open hczyni opened 2 months ago

hczyni commented 2 months ago

/root/miniconda3/bin/conda run -p /root/miniconda3 --no-capture-output python /mnt/d/1/MMRAN-main/main.py --- Focal_loss alpha = 0.25 ,将对背景类进行衰减,请在目标检测任务中使用 --- Epoch 0/239

现在处理的文件为 data_seg_cl/train/3/QG12084435_20230203_178.png 现在处理的文件为 data_seg_cl/train/3/05501530_20170918_159.png 现在处理的文件为 data_seg_cl/train/2/05825711_20180803_122.png 现在处理的文件为 data_seg_cl/train/1/QG12101379_20230413_138.png 现在处理的文件为 data_seg_cl/train/3/06431063_20200623_136.png 现在处理的文件为 data_seg_cl/train/3/05623270_20180418_222.png 现在处理的文件为 data_seg_cl/train/2/QG00009028_20180629_122.png 现在处理的文件为 data_seg_cl/train/3/06840163_20210919_188.png 现在处理的文件为 data_seg_cl/train/3/QG00010544_20180803_111.png 现在处理的文件为 data_seg_cl/train/3/QG00058514_20201030_139.png 1/8608,train_loss:1.25408053,seg_loss:0.83941346,cla_loss:0.41466707 现在处理的文件为 data_seg_cl/train/3/05930003_20190221_53.png 现在处理的文件为 data_seg_cl/train/1/K09090618_20181206_112.png ../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [0,0,0] Assertion idx_dim >= 0 && idx_dim < index_size && "index out of bounds" failed. Traceback (most recent call last): File "/mnt/d/1/MMRAN-main/main.py", line 455, in train(args) File "/mnt/d/1/MMRAN-main/main.py", line 329, in train train_model(model, criterion, criterion2, optimizer, dataloaders, dataloader_val) File "/mnt/d/1/MMRAN-main/main.py", line 215, in train_model loss2 = criterion2(outputs_2, labels2.long()) # cla_loss ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/miniconda3/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl return self._call_impl(*args, *kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/miniconda3/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl return forward_call(args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/mnt/d/1/MMRAN-main/unet.py", line 297, in forward self.alpha = self.alpha.gather(0, labels.view(-1)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: CUDA error: device-side assert triggered Compile with TORCH_USE_CUDA_DSA to enable device-side assertions.

ERROR conda.cli.main_run:execute(49): conda run python /mnt/d/1/MMRAN-main/main.py failed. (See above for error)

进程已结束,退出代码1

hczyni commented 2 months ago

如何解决呢?哭了

linkenfaqiu commented 2 months ago

您好!近期工作繁忙导致回复迟了,非常抱歉! 根据您的报错信息,代码报错主要发生在: main.py文件: loss2 = criterion2(outputs_2, labels2.long()) # cla_loss ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 以及最终报错点: unet.py文件的: self.alpha = self.alpha.gather(0, labels.view(-1)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unet.py报错点所处函数中,我使用了focal loss作为分类损失函数以应对样本不均衡情况。 根据报错信息可知是因为 labels 中的索引超出了 self.alpha(也就是 num_classes) 的大小范围,导致索引越界错误。 我所使用的数据集中的脑肿瘤共有三个类别,因此num_classes设置为3,如果您使用了您自己的数据集,也需要修改num_classes为您数据集的类别数。 为解决这一问题,您需要检查labels中的值是否是有效的索引:labels中的每个值都必须在0到num_classes-1的范围内,其中num_classes是类别的总数。 可以把unet.py文件focal_loss类forward函数的前部分改为:

def forward(self, preds, labels):
    preds = preds.view(-1, preds.size(-1))
    self.alpha = self.alpha.to(preds.device)

    # 打印标签检查
    print("Labels:", labels.view(-1))
    print("Alpha:", self.alpha)

    # 下面代码保持不变

您可以通过打印标签来检查是否符合要求。 希望我的解答可以帮到您,另外,祝您中秋节假日快乐!