报错:RuntimeError: CUDA error: device-side assert triggered

news/2024/11/24 9:09:36/

在运行CGAN代码时,有几个报错,记录解决办法

一、报错1

C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\Indexing.cu:1146: block: [0,0,0], thread: [39,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\Indexing.cu:1146: block: [0,0,0], thread: [40,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
。。。。(中间太多行了,就不放在这里了)
Traceback (most recent call last):File "D:\Pycharm_project\Data classfication\Data_Classfication_Project\CGAN\cgan.py", line 326, in <module>d_loss = (d_real_loss + d_fake_loss) / 2
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.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.

最开始还以为是代码运算时哪里的数据的维度有问题,找了半天,后来才发现,是类别的设置有问题。
代码中设置类比参数的时候如下:

parser.add_argument("--n_classes", type=int, default=3, help="number of classes for dataset")  # 几类

而我在赋值训练集的类别标签的时候,写的是1、2、3:

a = [1 for _ in range(47)]  # 类比1的标签
b = [2 for _ in range(43)]  # 类别2的标签
c = [3 for _ in range(39)]  # 类别3的标签
label_list = []
label_list = a + b + c
labels = np.array(label_list)

而在训练过程中,生成的标签为:

gen_labels = Variable(LongTensor(np.random.randint(0, opt.n_classes, batch_size)))  # 得到一个大小在0-2,长度为batch_size的数组

所以解决办法是
(1)修改训练集的类别标签

a = [0 for _ in range(47)]  # 类比1的标签
b = [1 for _ in range(43)]  # 类别2的标签
c = [2 for _ in range(39)]  # 类别3的标签
label_list = []
label_list = a + b + c
labels = np.array(label_list)

(2)或者修改训练过程中生成的标签

gen_labels = Variable(LongTensor(np.random.randint(1, opt.n_classes+1, batch_size)))  # 得到一个大小在0-2,长度为batch_size的数组

我用了第一种

二、报错2

使用dataloader方法输入数据时,报错:

Traceback (most recent call last):File "D:\Pycharm_project\Data classfication\Data_Classfication_Project\CGAN\cgan.py", line 299, in <module>gen_imgs = generator(z, gen_labels)File "D:\Anaconda\envs\gpu-pytorch\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_implreturn forward_call(*args, **kwargs)File "D:\Pycharm_project\Data classfication\Data_Classfication_Project\CGAN\cgan.py", line 103, in forwardimg = self.model(gen_input)  # img.shape是torch.Size([batch_size, 256])File "D:\Anaconda\envs\gpu-pytorch\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_implreturn forward_call(*args, **kwargs)File "D:\Anaconda\envs\gpu-pytorch\lib\site-packages\torch\nn\modules\container.py", line 217, in forwardinput = module(input)File "D:\Anaconda\envs\gpu-pytorch\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_implreturn forward_call(*args, **kwargs)File "D:\Anaconda\envs\gpu-pytorch\lib\site-packages\torch\nn\modules\batchnorm.py", line 171, in forwardreturn F.batch_norm(File "D:\Anaconda\envs\gpu-pytorch\lib\site-packages\torch\nn\functional.py", line 2448, in batch_norm_verify_batch_size(input.size())File "D:\Anaconda\envs\gpu-pytorch\lib\site-packages\torch\nn\functional.py", line 2416, in _verify_batch_sizeraise ValueError("Expected more than 1 value per channel when training, got input size {}".format(size))
ValueError: Expected more than 1 value per channel when training, got input size torch.Size([1, 256])进程已结束,退出代码1

而将batch_size由64修改成63就不报错,所以感觉是因为我的数据总共有129个,两个batch后只剩下一个数据,然后会引起报错,解决方法没有细查,我直接在dataloader方法中加入,反正只有一个数据舍去就舍去了:

dataloader = torch.utils.data.DataLoader(torch_dataset,batch_size=opt.batch_size,shuffle=True,drop_last=True   # 注意!这个参数为True就是舍去剩下不为整batch_size的数据
)

三、报错3

在保存loss项的时候

lossData_d_loss.append([epoch, d_loss.data.numpy()])  
lossData_g_loss.append([epoch, g_loss.data.numpy()]) 

报错:

Traceback (most recent call last):File "D:\Pycharm_project\Data classfication\Data_Classfication_Project\CGAN\cgan.py", line 347, in <module>lossData_d_loss.append([epoch, d_loss.data.numpy()])  
TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

原因是在使用numpy方法时,必须使用cpu(我使用了gpu),故将上两句代码修改为

lossData_d_loss.append([epoch, d_loss.cpu().detach().numpy()]) 
lossData_g_loss.append([epoch, g_loss.cpu().detach().numpy()]) 

就不报错了。


http://www.ppmy.cn/news/59529.html

相关文章

音视频八股文(10)-- mp4结构

介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14&#xff0c;出⾃MPEG-4标准第14部分 。它是⼀种多媒体格式容器&#xff0c;⼴泛⽤于包装视频和⾳频数据流、海报、字幕和元数据等。&#xff08;顺便⼀提&#xff0c;⽬前流⾏的视频编码格式AVC/H264 定义在MPEG-4 Part 10&#xff09…

画了个 MSP430F149的最小系统板 开源出来了

使用MSP430F149单片机设计的一个最小系统板&#xff0c;包含晶振电路、复位电路、CH340串口和BSL下载电路、按键和LED电路等&#xff0c;使用了Type-C接口作为供电和串口通信&#xff0c;另外引出了JTAG接口&#xff0c;所有IO口都引出了。 板载了3个按键和LED&#xff0c;可以…

一文彻底读懂nginx中的location指令

Nginx主配置文件结构 location 介绍 location是Nginx中的块级指令(block directive),&#xff0c;location指令的功能是用来匹配不同的url请求&#xff0c;进而对请求做不同的处理和响应&#xff0c;这其中较难理解的是多个location的匹配顺序&#xff0c;本文会作为重点来解释…

Win11如何下载安装java?

一、问题描述 我在复现论文代码的时候&#xff0c;遇到了这样的问题&#xff1a; 我没有下载java&#xff0c;那么该如何解决呢&#xff1f; 下载 Java 的作用是为了能够在计算机上运行使用 Java 语言编写的应用程序。Java 是一种广泛使用的编程语言&#xff0c;可用于开发各…

从0开始利用Jenkins构建Maven项目(微服务)并自动发布

0. 前言 本文旨在帮助读者梳理如何从0开始利用Jenkins构建Maven项目&#xff08;微服务&#xff09;的自动发布任务 本文目录如下&#xff1a; 如何完成自动部署 0. 前言1. 配置工具类地址1.1 JDK1.2 Git1.3 Maven 2. 安装Jenkins3. 安装额外的工具插件4. 配置必要参数4.1 配…

错题笔记第一篇

目录 1. strlen的用法2. case3. switch4. 二分查找 1. strlen的用法 正确答案 &#xff1a;C strlen计算的是字符串的长度&#xff0c;二字符串是以\0结尾&#xff0c;而咱们并没有存储\0&#xff0c;后序的空间是未知的&#xff0c;strlen找不到\0就会一直找&#xff0c;所以它…

大四毕业生想要找实习程序员工作 ,我总结了三点分享给大家

最近有粉丝留言&#xff0c;说自己已经大四了&#xff0c;想找一份实习工作&#xff0c;但不知道如何找一份实习工作&#xff0c;或者说在找实习工作之前&#xff0c;自己需要准备些什么。今天我们来聊聊这个话题。在聊这个话题之前&#xff0c;我觉得有必要认清当前互联网的现…

python实战应用讲解-【numpy数组篇】常用函数(六)(附python示例代码)

目录 Python numpy.ix_()函数 Python numpy.ma.compress_cols()函数 Python numpy.ma.compress_rowcols()函数 Python numpy.ma.mask_rowcols()函数 Python numpy.ma.mask_rows()函数 Python Numpy MaskedArray.astype()函数 Python numpy.ix_()函数 numpy.ix_()函数从多…