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

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

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

卷积神经网络作为深度学习方法的一种在计算机视觉中应用广泛。菜鸟一直想以这个作为切入点来学习深度学习知识,找到一个老外在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 );