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