MNIST初级入门解读

MNIST初级入门解读
https://www.tensorflow.org/get_started/mnist/beginners
http://yann.lecun.com/exdb/mnist/
http://www.jianshu.com/p/84f72791806f


机器学习的“Hello world!”程序就是MNIST。
MNIST是一个简单的计算机视觉数据图片集,手写的0-9。
MNIST数据集分为三部分:训练数据55000,测试数据10000,验证数据5000.(这一说法可能有点问题,参见:MNIST手写数字数据库简介)
图片标准:28x28=784象素。扁平化后后,形成784x1的向量。虽然丢失了二维结构的信息,但softmax回归也用不上。
把每张图片视为一个784个值的一维向量,55000张图片就是shape=[55000,784]的二维矩阵。
每个元素是一个0-1之间的灰度值。(0-255: 0,背景,白色; 255,前景,黑色)


标签:每张图有一个对应的标签,指出这张图写的是什么数字。代码设计中,一个数字用一个长度为10的向量表示,数字为几,就把对应下标的位置置1,下标从0开始。如数字3,写为 [0,0,0,1,0,0,0,0,0,0].这样,标签的shape=[55000,10]
本章的目的是学习softmax回归。
mnist_softmax.py的源码下载:https://www.github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/examples/tutorials/mnist/mnist_softmax.py
如果不想下载,安装tensorflow后,可直接在IDE中导入【安装目录】\Lib\site-packages\tensorflow\examples\tutorials\mnist的python项目。


MNIST手写数字数据库简介
60000个训练数据,10000个测试数据。固定图片大小。不用再去预处理和格式化。但实际项目中,这一步少不了,而且比较繁琐。
运行程序后,后有四个包下载到本地目录:C:\tmp\tensorflow\mnist\input_data
t10k-images-idx3-ubyte.gz #测试数据图片10000张
t10k-labels-idx1-ubyte.gz #测试数据标签10000个
train-images-idx3-ubyte.gz #训练数据图片60000张
train-labels-idx1-ubyte.gz #训练数据标签60000个
在mnist.py中read_data_sets函数中,base.maybe_download给出的下载路径为:
SOURCE_URL = 'https://storage.googleapis.com/cvdf-datasets/mnist/'
也就是从google下下载的,不是直接从http://yann.lecun.com/exdb/mnist/下载的。
图片不是标准的image格式,得根据它的格式写程序重新读。
图片内容部分20x20,加上边框部分是28x28.
MNIST源自NIST的特别数据库(SD-3,Special Database 3)和SD-1。SD-3来自人口普查局,比较好认。SD-1来自高校,难认点。MNIST从SD-3和SD-1各抽了30000份数据,共60000份做训练数据。测试数据的10000份也是从两个库各抽了一半。
近20年来,这个数据集被各种方式测试,成为经典。包括:Linear Classifiers,KNN,Boosted Stumps,Non-Linear Classifiers,支持向量机SVM,Neural Nets,卷积网Convolutional nets。错误率也从最早的12%降到了0.23%。一般认为,卷积网的效果最好。
图片格式:
文件的整数(integer)以大端(high endian)方式存储。注意:intel处理器是小端方式,需要转换。


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
label的值为0-9.


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
pixel的值:0-255


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


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




IDX文件通用格式:
magic number 
size in dimension 0 
size in dimension 1 
size in dimension 2 
..... 
size in dimension N 
data


解释:
1.魔术数。 大端方式。4bytes.
           |------------|------------|------------|------------|
           |   0        |  0         |编码数据类型| 维数       |   
  |------------|------------|------------|------------|
   编码数据类型:即指出data段是什么数据类型。包括:
0x08: unsigned byte 
0x09: signed byte 
0x0B: short (2 bytes) 
0x0C: int (4 bytes) 
0x0D: float (4 bytes) 
0x0E: double (8 bytes)
   维数:即rank.
2.size段,大端方式。4bytes. 维数是几就应该有几行。
3.data段,类拟于高维的C数组。
如何查看IDX的图片文件?
解析查看代码,参见:http://www.jianshu.com/p/84f72791806f
代码是python2.7版本的,修改print语句为带括号的形式,正确放置IDX文件路径,即可查看。在matplot窗口查看图,控制台会给出对应的标签。




mnist.train.images
mnist.train.labels
两者成对出现。


问题1:到底训练数据是55000还是60000?
回答:从代码调试看,num_images=60000.最后返回的是一个shape(60000,28,28,1)的张量。
问题2:象素值到底是0-1还是0-255?
回答:从代码调试看,值是0-255.
问题:标签是如何表式的?
回答:标签从文件中读出来时是个一维list,[5,0,4...5,6,8],通过mnist.py的dense_to_one_hot()后,就成了一个shape(6000,10)的张量。


softmax就是这样一层模型,它给出每种情况一种可能性,所有的可能性加起来为1。一般用来形成输出层的概率分布。
过程:1)累加绝对数  2)归一化
如果图片不象某类,给个负数;如果图片象某类,给个正数。可以这样理解,比如数字0,如果在图的中间地带出来了色彩,那它不太可能是0,给一个负向激励;相反,色彩出现在中间地带的周围,它更有可能是0,给一个正向激励。


数学部分图解:


实现部分:
要点仍然是定义损失函数,最小化损失函数。
这里使用“交叉熵”函数做为损失函数,下面是原始的形式,比较接近公式定义,但不稳定,所以使用改进行形式。
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))


核心代码(改进形式):
cross_entropy = tf.reduce_mean(
          tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) #损失函数

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) #优化





手写体5的程序内部存储结构:



标签的程序内部存储结构:




下次做点小练习。

今天跑了下mnist_deep.py,试了三次,基本上训练数据快跑完,该跑测试数据的时候,python就挂了。从20000减到200都不行。可能环境的兼容性还是有点问题。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章