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

来源:互联网 发布:新西兰博士含金量知乎 编辑:程序博客网 时间:2024/04/30 23:23

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