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

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内容没有拷贝过去。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值