cuda-cnn之mnist文件读取(1)

本文介绍如何使用CUDA技术读取并处理MNIST数据集,详细解析了训练和测试样本及其标签的读取过程,同时展示了样本数据结构及标签数据的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://github.com/zhxfl/CUDA-CNN


第一步是通过readMnistData读取训练样本和测试样本

"mnist\\train-images.idx3-ubyte",训练样本

"mnist\\train-labels.idx1-ubyte"训练标签

训练样本一共6W个

"mnist\\t10k-images.idx3-ubyte", 测试样本

"mnist\\t10k-labels.idx1-ubyte" 测试标签

测试样本一共1W个

样本包括训练样本和测试样本。标签包括训练标签和测试标签


readMnistData中read_Mnist用于读取样本read_Mnist_Label用于读取标签数据

整个样本数据结构由16字节头部

4字节的magic_number

4字节的样本数量 (小端)

4字节每个样本的rows (小端)

4字节每个样本的cols (小端)

比如

00000000h: 00 00 08 03 00 00 27 10 00 00 00 1C 00 00 00 1C ; ......'.........

00 00 08 03就是magic number

00 00 27 10 =10000个样本

00 00 00 1c 表示28行

00 00 00 1c 表示28列

接下来就是读取样本数据

一共读取magic_number个。每个28*28字节

因此

训练样本文件大小为28*28*60000+16=47040016

测试样本文件大小为28*28*10000+16=7840016

读取的时候每个图片分配的内存n_rows行*n_cols列*1通道。训练图片是灰度图。所以只有一通道,可能还有RGB三通道的。

cuMatrix<float>* tpmat = new cuMatrix<float>(n_rows, n_cols, 1);

依次读取灰度字节unsigned char 转换为缩放为float 存放到矩阵中。

tpmat->set(r, c, 0, (float)temp * 2.0f / 255.0f - 1.0f);

将0-255缩放到 -1到1之间的float保存  (float)temp * 2.0f / 255.0f - 1.0f


然后把这个cuMatrix矩阵的指针保存到矩阵指针向量trainX中

cuMatrixVector<float>trainX;

trainX 是一个保存float矩阵指针的向量。每一个元素都指向一个cuMatrix<float>的图片对象


接下来读取标签。

标签只有8个字节头。接下来的就是数据

00000000h: 00 00 08 01 00 00 27 10                         ; ......'.

也是magic number + number

接下来的每个字节就是0-9标签

所以测试的lable文件大小为10008.样本的label大小为60008

不同的是标签只需要一个一维的向量表示就可以了 cuMatrix<int>* trainY


cuMatrix 的toGpu和toCpu就是整个矩阵结构的拷贝

由于label比较小。因此读取的时候就直接拷贝到显存当中了

cuMatrixVector包含了整个训练集。全部放到显存中不太好。因此读取的时候就只放到了内存中。没有拷贝到显存中去。


#cuMatrixVector的toGpu只是拷贝了整个vector的指针,分配了内容。但是里面的Matrix内容没有拷贝过去。






<think>我们正在解决一个PyTorch模型加载时的"Invalidargument"错误,文件路径为'D:\x08ishe\DnCNN-master\models\x08est_mnist_cnn.pth'注意:文件路径中包含十六进制转义字符(\x08),这可能是导致路径无效的原因。因为在字符串中,'\x'会被解释为转义序列。根据用户提供的引用[1]和[5]中的思路,我们需要关注参数传递和文件路径的有效性。步骤:1.检查文件路径字符串中的转义字符。在Python中,反斜杠'\'是转义字符,因此路径中的'\x'会被解释为十六进制转义。例如,路径中的'\x08'会被解释为一个ASCII字符(退格),这显然不是我们想要的。2.解决方案:a)使用原始字符串(rawstring)以避免转义:在字符串前加'r',如r"D:\x08ishe\DnCNN-master\models\x08est_mnist_cnn.pth"b)将反斜杠'\'替换为正斜杠'/',因为Windows系统通常也支持正斜杠路径,如"D:/x08ishe/DnCNN-master/models/x08est_mnist_cnn.pth"c)对路径中的每个反斜杠进行转义,即用双反斜杠"\\",如"D:\\x08ishe\\DnCNN-master\\models\\x08est_mnist_cnn.pth"3.在加载模型的代码中,确保使用了正确的路径表示。示例代码:在加载模型时,我们通常这样写:model.load_state_dict(torch.load(model_path))4.如果路径问题解决后仍然报错,则检查文件是否存在以及文件是否完整。5.另外,也要考虑文件路径的长度是否超出了系统限制(Windows下最大路径长度默认为260个字符),但这里路径不长,可能不是这个问题。6.还要注意,路径中可能含有不可见字符(如转义产生的退格字符)导致路径错误。根据引用[3]提到的错误(--gpu-architecture参数无效),我们还应该检查PyTorch版本与CUDA版本的兼容性,但此错误提示是"Invalidargument",且用户明确提到路径无效问题,所以先解决路径问题。但是,用户的问题描述中直接给出了一个文件路径字符串,其中包含转义序列,因此最直接的原因就是路径字符串被转义了。建议用户按照以下方式修改路径字符串:方法一:使用原始字符串(推荐)修改前:path='D:\x08ishe\DnCNN-master\models\x08est_mnist_cnn.pth'修改后:path=r'D:\x08ishe\DnCNN-master\models\x08est_mnist_cnn.pth'方法二:使用双反斜杠修改后:path='D:\\x08ishe\\DnCNN-master\\models\\x08est_mnist_cnn.pth'方法三:使用正斜杠修改后:path='D:/x08ishe/DnCNN-master/models/x08est_mnist_cnn.pth'如果用户不是直接在代码中写这个路径字符串,而是从其他地方(如配置文件读取的,那么需要确保在读取后对路径进行正确的转义处理,或者修改配置文件使用上述方法之一。如果用户已经采用了上述方法之一,仍然报错,则考虑以下可能性:-文件不存在:检查路径是否正确,文件是否被移动或删除。-文件损坏:重新下载或生成模型文件-权限问题:确保程序有权限访问该路径。此外,引用[4]提到了一种参数解析的错误,如果用户是通过命令行参数传递路径,那么也要确保在命令行参数传递时路径字符串没有被错误转义。例如,在命令行中传递路径参数时,应使用双引号将路径括起来,避免反斜杠被当作转义字符。但根据用户给出的错误信息,是直接加载模型时路径无效,所以重点在代码中的路径字符串。总结:该错误大概率是由于路径字符串中的转义序列引起的,通过使用原始字符串、双反斜杠或正斜杠可以解决。下面我们用结构化的方式回答:</think> 针对加载PyTorch模型时出现的`Invalid argument`错误,路径为`'D:\x08ishe\DnCNN-master\models\x08est_mnist_cnn.pth'`,以下是根本原因分析和解决方案: ### 问题原因 1. **转义字符问题**(主要根源): - 路径中的`\x08`会被Python识别为十六进制转义字符(ASCII退格符) - 实际路径被解析为:`D:_backspace_ishe\DnCNN-master\models_backspace_est_mnist_cnn.pth` - 导致系统找不到有效路径[^1][^5] 2. **潜在附加问题**: - 文件后缀`.pth`拼写错误(正确应为`.pth`,非`.pth`) - 路径包含非常规字符(如中文字符`卑设`可能编码异常) --- ### 解决方案 #### 方法1:转义反斜杠(推荐) ```python # 修改路径字符串 model_path = r'D:\x08ishe\DnCNN-master\models\x08est_mnist_cnn.pth' # 原始字符串 model = torch.load(model_path) ``` #### 方法2:使用正斜杠替代 ```python model_path = 'D:/x08ishe/DnCNN-master/models/x08est_mnist_cnn.pth' # Windows兼容正斜杠 ``` #### 方法3:双反斜杠转义 ```python model_path = 'D:\\x08ishe\\DnCNN-master\\models\\x08est_mnist_cnn.pth' ``` --- ### 验证步骤 1. **检查文件实际存在**: ```python import os print(os.path.exists(r'D:\x08ishe\DnCNN-master\models\x08est_mnist_cnn.pth')) ``` 2. **文件完整性检查**: ```python import hashlib with open(model_path, 'rb') as f: print(hashlib.md5(f.read()).hexdigest()) # 对比原始MD5值 ``` 3. **系统兼容性验证**: ```python print(torch.__version__) # 确认PyTorch版本与模型匹配 ``` --- ### 预防措施 1. 永远使用原始字符串处理Windows路径: ```python path = r'C:\users\project\model.pth' ``` 2. 路径避免包含`\x`、`\n`等特殊序列 3. 使用`pathlib`库进行路径操作: ```python from pathlib import Path model_path = Path('D:/x08ishe/DnCNN-master/models/x08est_mnist_cnn.pth') ``` > ⚠️ 若仍报错,检查CUDA版本与PyTorch的兼容性: > ```bash > nvcc --version # 验证CUDA版本 > torch.cuda.is_available() # 确认PyTorch识别GPU[^3] > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值