菜鸟学卷积神经网络基础知识(一)手写数字数据库究竟是个啥?

时间:2022-11-04 22:02:37

菜鸟学卷积神经网络基础知识(一)手写数字数据库究竟是个啥?

卷积神经网络作为深度学习方法的一种在计算机视觉中应用广泛。菜鸟一直想以这个作为切入点来学习深度学习知识,找到一个老外在06年写的用卷积神经网络识别手写字符的代码。以这个代码为例子,好好学习这么搭建和训练一个卷积神经网络。

网址在这:

http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi

第一步,数据集是什么?

MNIST是一个据说很出名的手写数字数据库,据说是美国中学生手写的数字.这就是数据集的来源http://yann.lecun.com/exdb/mnist/

四个文件

train-images-idx3-ubyte: training set images 
train-labels-idx1-ubyte: training set labels 
t10k-images-idx3-ubyte:  test set images 
t10k-labels-idx1-ubyte:  test set labels

免费的开源 7-Zip 实用程序可以对gz文件夹进行解压,就能得到上述文件。数据集包含的共 70,000 图像 ; 60,000 训练图像 (用于创建红外模型) 和 10,000 测试图像 (用于评估模型的精度)。 每个 MNIST 图像是一个单一的手写的数字字符的数字化的图片。 每个图像是 28 x 28 像素大小。 每个像素值是 0,表示白色,至 255,表示黑。 中间像素值表示的灰度级。  1 显示了训练集的前八位的图像。 对应于每个图像的实际数字是显然的对于人来说,但确定数字是非常困难的挑战的计算机。

图 1 首八 MNIST 训练图像

RAINING SET LABEL FILE (train-labels-idx1-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  60000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label

The labels values are 0 to 9.

TRAINING SET IMAGE FILE (train-images-idx3-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  60000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

TEST SET LABEL FILE (t10k-labels-idx1-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  10000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label

The labels values are 0 to 9.

TEST SET IMAGE FILE (t10k-images-idx3-ubyte):

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  10000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black). 

怎么都数据?参考这两篇文章

https://msdn.microsoft.com/zh-cn/magazine/dn745868.aspx

http://blog.csdn.net/fengbingchun/article/details/49611549

实际上很简单,一个是图像数据,一个是标签数据,都是一大串二进制数据。图像数据:最前面的32位是magic number ,然后32位是图像大小,再然后32位是图像行,接着32位是图像的列。接下来就是图像的像素灰度值,无符号8位,正好对应0-255。一直数28*28个无符号8位的数据,这些数据是一行,把它按照row-wise貌似是行进行重构就成了一个28*28的第一张图像。后面的数据同理。标签数据同理,只不过无符号8位数据对应的不是灰度值,而是标签。

OK 介绍完这个,看看那个老外是怎么实现读入MINIST的,搞清楚它这个就好进行修改它的程序了。主要是这个函数OnButtonOpenMnistFiles()

 

 

函数开始建了头文件信息的结构体,包括nMagic、nItems、nRows、nCols。和说明一一对应的。然后通过这几个

CFile m_fileTrainingLabels;

CFile m_fileTrainingImages;

CFile m_fileTestingLabels;

CFile m_fileTestingImages;

来读取弹出对话框中选择的文件路径中文件。当然还要判断文件中的数据是否是MINIST中文件的数据。四个文件读取完毕后,实际上获取了指向这四个文件的文件指针。

然后用下面两个函数就能获取图像数据

   定位到图像数据位置

m_fileTrainingImages.Seek( fPos, CFile::begin );

   读取图像数据到二维数组

m_fileTrainingImages.Read( pArray, cCount );