UPDATE 2023 01 11
我觉得评论区的方法比我的方法更加简单,建议诸位老铁先看评论区:


好兄弟们看看是不是这个错:

RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

先在上边儿导入 os 库,把那个环境变量导入:

import os
os.environ['CUDA_LAUNCH_BLOCKING'] = '1' # 下面老是报错 shape 不一致

这样再出错了,打印的信息就比较详细了

这是原来的报错信息,这个报错信息,参考价值不大,好兄弟可以看后面:

torch.Size([4, 1, 96, 96, 96]) torch.Size([4, 1, 96, 96, 96])
Training (0 / 20 Steps) (loss=4.11153):   2%|| 1/58 [00:14<13:44, 14.47s/it]
torch.Size([4, 1, 96, 96, 96]) torch.Size([4, 1, 96, 96, 96])
Training (1 / 20 Steps) (loss=4.06208):   2%|| 1/58 [00:27<13:44, 14.47s/it]
Validate (X / X Steps) (dice=X.X):   0%|          | 0/5 [00:00<?, ?it/s]
torch.Size([2, 321, 307, 178]) torch.Size([2, 321, 307, 178])
----------------------------------------
/pytorch/aten/src/ATen/native/cuda/ScatterGatherKernel.cu:312: operator(): block: [189,0,0], thread: [1,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && "index out of bounds"` failed.
/pytorch/aten/src/ATen/native/cuda/ScatterGatherKernel.cu:312: operator(): block: [63,0,0], thread: [60,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && "index out of bounds"` failed.
/pytorch/aten/src/ATen/native/cuda/ScatterGatherKernel.cu:312: operator(): block: [149,0,0], thread: [6,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && "index out of bounds"` failed.
/pytorch/aten/src/ATen/native/cuda/ScatterGatherKernel.cu:312: operator(): block: [149,0,0], thread: [12,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && "index out of bounds"` failed.
Validate (X / X Steps) (dice=X.X):   0%|          | 0/5 [00:27<?, ?it/s]
Training (1 / 20 Steps) (loss=4.06208):   2%|| 1/58 [00:55<53:07, 55.92s/it]
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Input In [7], in <cell line: 97>()96 metric_values = []97 while global_step < max_iterations:
---> 98     global_step, dice_val_best, global_step_best = train(99         global_step, train_loader, dice_val_best, global_step_best100     )101 model.load_state_dict(torch.load(os.path.join(root_dir, "best_metric_model.pth")))Input In [7], in train(global_step, train_loader, dice_val_best, global_step_best)56 if (57     global_step % eval_num == 0 and global_step != 058 ) or global_step == max_iterations:59     epoch_iterator_val = tqdm(60         val_loader, desc="Validate (X / X Steps) (dice=X.X)", dynamic_ncols=True61     )
---> 62     dice_val = validation(epoch_iterator_val)63     epoch_loss /= step64     epoch_loss_values.append(epoch_loss)Input In [7], in validation(epoch_iterator_val)17 # print(val_output_convert[1].shape, val_labels_convert[1].shape)18 print("-"*40)
---> 19 print(val_output_convert[0].cpu().numpy().max(), 20       val_labels_convert[0].cpu().numpy().max())21 print(val_output_convert[0].cpu().numpy().min(), 22       val_labels_convert[0].cpu().numpy().min())23 # print(val_labels_convert.max(), val_labels_convert.min())RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

这是我错误的地方:

x, y = (batch["image"].cuda(), batch["label"].cuda())
print(x.shape, y.shape)
logit_map = model(x)
print(logit_map.shape, "FUCKCKKCKCKCCK")
torch.Size([4, 1, 96, 96, 96]) torch.Size([4, 1, 96, 96, 96])
torch.Size([4, 14, 96, 96, 96]) FUCKCKKCKCKCCK

稍微看一下程序,x 显然就是输出的图片,而 y 就是对应的label,logit_map 就是对应的预测map

好兄弟们可能猜到了,我这个是3D的分割,所以维度是5,后面的[96, 96, 96] 是输出的shape
那个4是batch_size,1 那一维,是输出的类别

我这个是只有前景和背景,所以只要分两类就可以了,这里应该改成2


话说如果真的就这么简单,我就不氵这篇博客,碰到这个问题的老铁们,一定是拿来改别人代码,没改完整,才遇到这个问题的,今儿咱们就说叨说叨

  1. 改写自己的数据集,嗯,一般就是新写一个Dataset类,要是他的数据集格式和你的一样,那直接改路径就好了

  2. 改写输出的模型,一般你的输入都是三通道,输入参数 input_channel 一般不用改,但是输出的类别要改啊,你是输出几类,就是改几类
    (分割这里有个问题,有的模型会包括背景,有的会不包括背景,涉及到一个 +1 或者 -1 的问题)

一般来说,模型的输入或者输出通道数,都会在模型的构造函数最开始定义,下边的例子就是改一下out_channels 就行

model = UNETR(in_channels=1,out_channels=2,   # <------------ 改这里img_size=(96, 96, 96),feature_size=16,hidden_size=768,mlp_dim=3072,num_heads=2,  # 这里这个类别要改的pos_embed="perceptron",norm_name="instance",res_block=True,dropout_rate=0.0,
).to(device)
  1. 改前处理,这个也可以看做数据增强的一部分,这里一般不涉及通道数或者类别的改动,但是某些域的照片,可能不适合另一个域的数据增强方法,比如医学图像一般只用:

Randomly adjust intensity for data augmentation
而如果你用随机旋转就不是很合适

  1. 后处理,一般有NMS什么的,不用改
    但是在我遇到的问题中,有这个
post_label = AsDiscrete(to_onehot=2)                 # 这里是需要改的
post_pred = AsDiscrete(argmax=True, to_onehot=2)     # 这里是需要改的

官网的解释:

Execute after model forward to transform model output to discrete values.It can complete below operations:-  execute `argmax` for input logits values.-  threshold input value to 0.0 or 1.0.-  convert input value to One-Hot format.-  round the value to the closest integer.

反正就是把你的结果离散化,你看到 one_hot 眼睛其实就有光了(因为这个东西的长度会随着需求的变化而改变),所以这里也要改

  1. 后面的 loss 和 optimizer 一般不用改,看心情吧

  2. 一个没什么用的trick,我还是拿例子说

https://github.com/Project-MONAI/research-contributions/tree/master/UNETR/BTCV

我这个问题是器官分割,一个13个器官,加上一个背景,一共14类
所以要改的地方有:


只有这三个,在那个页面,按住 ctrl + F ,输入 14 一个一个看,是不是需要改的

这么憨憨的方法,我最开始咋没想到呢。。。。。。

有参考自:
https://blog.csdn.net/Penta_Kill_5/article/details/118085718

CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below m相关推荐

  1. (已解决)RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors

    报错原因: 大概率是因为:代码有地方数组越界.盲猜是在交叉熵损失函数那里,反正我是在这里. 小概率是其他原因.不过,下面的解决办法是通用的. 解决办法: 先device="cpu" ...

  2. for循环多次调用cuda kernel函数_CUDA程序设计入门(二)——核函数

    上期内容:SM和SP 原本这期的标题为"任务分解与执行模式".因为该标题覆盖的知识面太广,导致坑很难填,所以我改成了"核函数",本期重点讨论核函数. 这期我们将 ...

  3. 如何预期计算cuda kernel代码的性能水平

    CGMA(Compute to Global Memory Access) CGMA的定义是在CUDA程序的某一个区域内每次访问全局存储器时,执行浮点运算的次数,通过对某一个区域代码计算CGMA值,大 ...

  4. CUDA kernel函数不执行、不报错的问题

    CUDA 核函数不执行.不报错的问题 最近使用CUDA的时候发现了一个问题,有时候kernel核函数既不执行也不报错.而且程序有时候可以跑,而且结果正确:有时候却不执行,且不报错,最后得到错误的结果. ...

  5. 出现错误(已解决)RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA ker

    出现问题(已解决)RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA ker ...

  6. (ubuntu)YOLOv5报错:RuntimeError: CUDA error: no kernel image is available for execution on the ...

    笔者之前在另一台电脑成功跑通了自己修改的yolov5,但在新系统运行时报了如下错误 RuntimeError: CUDA error: no kernel image is available for ...

  7. 解决:RuntimeError: CUDA error: device-side assert triggered

    @[TOC]解决办法:RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynch ...

  8. 无CUDA支持的dlib库的安装与使用

    前言 Dlib 是一个 C++ 工具包,被广泛应用于工业和学术界.Dlib 的开源许可允许在任何应用程序中免费使用它.Dlib支持导出其他编程语言如Python的binding. 在Python环境下 ...

  9. RuntimeError: CUDA out of memory. Tried to allocate 50.00 MiB (GPU 0; 4.00 GiB total capacity; 682.9

    1. 问题 训练模型时报错: RuntimeError: CUDA error: out of memory CUDA kernel errors might be asynchronously re ...

  10. PyTorch报错“/.../Loss.cu: ... [59,0,0] Assertion input_val >= zero input_val <= one failed.”

    1 问题描述 今天在调试代码的时候,出现这样一个错误: PyTorch Assertion: /opt/conda/conda-bld/pytorch_1640811803361/work/aten/ ...

最新文章

  1. activity属性设置大全
  2. LeetCode——分治
  3. 最新的vue webpack模板没有dev-server.js文件,进行后台数据模拟笔记
  4. Unique Binary Search Trees ll -深度优先遍历DFS
  5. laravel validate
  6. DialogBox和DialogBoxParam函数
  7. HDU-1166 敌兵布阵
  8. 数据可视化——柱状图
  9. 别错过这张AI商用清单:你的生产难题可能被一个应用解决!
  10. 符合Scorm的LMS系统
  11. 赋能农业生态链,打造“云端青柚”UZ新概念
  12. IDA使用初探-1.启动IDA
  13. word与spoolsv.exe占CPU过高
  14. IKEv2的认证数据生成过程
  15. 【JMX】-----JMX概述
  16. 计算机毕业设计Java星星电影购票网站(源码+系统+mysql数据库+lw文档
  17. 华硕B85M-V PLUS 刷NVME协议BIOS
  18. python黑科技自动p图_大神级Python工程师是怎么P图的,带你用Python玩转P图
  19. iphone制作电子杂志
  20. 基于RFID纺织类的资产管理系统浅析,RFID固定资产管理--新导智能

热门文章

  1. 用canvas写个接水管小游戏
  2. Jquery定时弹广告
  3. 【原创】聊天机器人与自动问答技术
  4. 破立之间:金融科技时代的普惠新机会、新挑战
  5. 适配IE浏览器的那些坑
  6. 如何让RS485总线挂接更多数量的设备?
  7. Flask中蓝本(Blueprint)的使用
  8. 关于周期性学习率(Cyclical Learning Rate, CLR)
  9. python黑底白字的车牌_Python+OpenCV实现车牌字符分割和识别
  10. vba操作ie关闭窗口