TensorFlow 入门之手写识别(MNIST) 数据处理 一

MNIST
Fly
softmax回归

准备数据

MNIST是在机器学习领域中的一个经典问题。该问题解决的是把28x28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9.

  1. from IPython.display import Image 

  2. import base64 

  3. Image(data=base64.decodestring(url),embed=True) 

同时我们可以通过TensorFlow提供的例子来下载有Yann LeCun提供的MNIST提供的如上的手写数据集。

文件 内容
train-images-idx3-ubyte.gz 训练集图片 - 55000 张 训练图片, 5000 张 验证图片
train-labels-idx1-ubyte.gz 训练集图片对应的数字标签
t10k-images-idx3-ubyte.gz 测试集图片 - 10000 张 图片
t10k-labels-idx1-ubyte.gz 测试集图片对应的数字标签
  1. import os 

  2. import urllib 


  3. SOURCE_URL = 'http://yann.lecun.com/exdb/mnist/' 

  4. # WORK_DIRECTORY = "/tmp/mnist-data" 

  5. WORK_DIRECTORY = '/home/fly/TensorFlow/mnist' 


  6. def maybe_download(filename): 

  7. """A helper to download the data files if not present.""" 

  8. if not os.path.exists(WORK_DIRECTORY): 

  9. os.mkdir(WORK_DIRECTORY) 

  10. filepath = os.path.join(WORK_DIRECTORY, filename) 

  11. if not os.path.exists(filepath): 

  12. filepath, _ = urllib.urlretrieve(SOURCE_URL + filename, filepath) 

  13. statinfo = os.stat(filepath) 

  14. print 'Succesfully downloaded', filename, statinfo.st_size, 'bytes.' 

  15. else: 

  16. print 'Already downloaded', filename 

  17. return filepath 


  18. train_data_filename = maybe_download('train-images-idx3-ubyte.gz') 

  19. train_labels_filename = maybe_download('train-labels-idx1-ubyte.gz') 

  20. test_data_filename = maybe_download('t10k-images-idx3-ubyte.gz') 

  21. test_labels_filename = maybe_download('t10k-labels-idx1-ubyte.gz') 


解压 与 重构

数据被解压成一个二维的Tensor:[image, index, pixel, index],pixel 列是像素的点。0表示的是背景色(白色),255表示的是前景色(黑色)。

上面下载的数据是压缩的格式,我们需要解压它。而且每一幅图是值为[0...255],我们要将它们缩放到[-0.5, 0.5]之间。

我们可以来看一下图片解压后的文件格式:

[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

对应的代码是:

  1. import gzip, binascii, struct, numpy 

  2. import matplotlibpyplot as plt 


  3. with gzip.open(test_data_filename) as f: 

  4. # 打印出解压后的图片格式的头格式 

  5. for field in ['magic number', 'image count', 'rows', 'columns']: 

  6. # struct.unpack reads the binary data provided by f.read. 

  7. # The format string '>i' decodes a big-endian integer, which 

  8. # is the encoding of the data. 

  9. print field, struct.unpack('>i', f.read(4))[0] 


  10. buf = f.read(28*28) 

  11. image = numpy.frombuffer(buf, dtype=numpy.uint8) 


  12. # 打印出前十个image的数据 

  13. print 'First 10 pixels: ', iamge[:10] 


  14. # ==> 

  15. # magic number 2051 

  16. # image count 10000 

  17. # rows 28 

  18. # columns 28 

  19. # First 10 pixels: [0 0 0 0 0 0 0 0 0 0] 


当然我们也可以将解压后的图给绘制出来

  1. # 我们将绘制图以及关于这个图的直方图 

  2. _, (ax1, ax2) = plt.subplots(1,2) 

  3. ax1.imshow(image.reshape(28,28), cmap=plt.cm.Greys) 


  4. ax2.hist(image, bins=20, range=[0,255]) 


我们也可以将reScale后的数据绘制出来看看

  1. # Let's convert the uint8 image to 32 bit floats and rescale  

  2. # the values to be centered around 0, between [-0.5, 0.5].  

  3. #  

  4. # We again plot the image and histogram to check that we  

  5. # haven't mangled the data. 

  6. scaled = image.astype(numpy.float32) 

  7. scaled = (scaled - (255 / 2.0)) / 255 

  8. _, (ax1, ax2) = plt.subplots(1, 2) 

  9. ax1.imshow(scaled.reshape(28, 28), cmap=plt.cm.Greys); 

  10. ax2.hist(scaled, bins=20, range=[-0.5, 0.5]); 


具体的数据使用可以看TensorFlow提供的测试代码[在IPython中是第三个实例3_mnist_from_scratch.ipynb]

手写识别入门

MNIST手写数据集

MNIST数据集的官网是Yann LeCun's website。 在这里,我们提供了一份python源代码用于自动下载和安装这个数据集。你可以下载这份代码,然后用下面的代码导入到你的项目里面,也可以直接复制粘贴到你的代码文件里面。(当然你也可以使用前面提到的代码来下载手写的数字数据)

  1. from tensorflow.examples.tutorials.mnist import input_data 


  2. # 通过指定下载地址就可以下载数据 

  3. mnist = input_data.read_data_sets("/home/fly/TensorFlow/mnist", one_hot=True)  


图片以及标签的数据格式处理

下载解压后,得到的数据分为两部分,60000行的训练集(mnist.train)和10000行的测试数据集(mnist.test)。由前面的介绍可以知道,每个MNIST数据有两部分组成:一个手写数字的图片以及一个对应的标签。比如在训练集中数据图片为mnist.train.images以及标签mnist.train.labels.

因为每一张图片是28 x 28的像素,所以我们可以使用一个数字数组来表示这张图:

然后我们再把这个数组展开为长度为28 * 28 = 784 的 一维向量。因此,在MNIST训练数据集中,mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。

相对应的MNIST数据集的标签是介于0到9的数字,用来描述给定图片里表示的数字。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0]).因此, mnist.train.labels 是一个 [60000, 10] 的数字矩阵。


Fly

2016.6

TensorFlow 入门之手写识别(MNIST) 数据处理 一的更多相关文章

  1. TensorFlow 入门之手写识别(MNIST) softmax算法

    TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST flyu6 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  2. TensorFlow 入门之手写识别(MNIST) softmax算法 二

    TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  3. TensorFlow 入门之手写识别CNN 三

    TensorFlow 入门之手写识别CNN 三 MNIST 卷积神经网络 Fly 多层卷积网络 多层卷积网络的基本理论 构建一个多层卷积网络 权值初始化 卷积和池化 第一层卷积 第二层卷积 密集层连接 ...

  4. densenet tensorflow 中文汉字手写识别

    densenet 中文汉字手写识别,代码如下: import tensorflow as tf import os import random import math import tensorflo ...

  5. Tensorflow之基于MNIST手写识别的入门介绍

    Tensorflow是当下AI热潮下,最为受欢迎的开源框架.无论是从Github上的fork数量还是star数量,还是从支持的语音,开发资料,社区活跃度等多方面,他当之为superstar. 在前面介 ...

  6. 使用tensorflow实现mnist手写识别(单层神经网络实现)

    import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import n ...

  7. tensorflow笔记(四)之MNIST手写识别系列一

    tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html ...

  8. tensorflow笔记(五)之MNIST手写识别系列二

    tensorflow笔记(五)之MNIST手写识别系列二 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7455233.html ...

  9. TensorFlow MNIST(手写识别 softmax)实例运行

    TensorFlow MNIST(手写识别 softmax)实例运行 首先要有编译环境,并且已经正确的编译安装,关于环境配置参考:http://www.cnblogs.com/dyufei/p/802 ...

随机推荐

  1. C# Event.ClickCount 解决垃圾鼠标带来的烦恼

    今天调试遇到个Bug,百思不得其解的是在自己的设备上重来不重现,在测试机上百分百重现,如下: 问题:点击一次Button执行两次Click操作 分析:看Log的确是执行了两次,就像真的点击了两次But ...

  2. JavaScript中的+= 是什么?

    +=表示相加并赋值,“i+=5”与“i=i+5”是等效的. 类似的运算符还有-=,*=,/=. i-=5等价于i=i-5; i*=5等价于i=i*5: i/=5等价于i=i/5.

  3. Python定制容器

    Python 中,像序列类型(如列表.元祖.字符串)或映射类型(如字典)都是属于容器类型,容器是可定制的.要想成功地实现容器的定制,我们需要先谈一谈协议.协议是什么呢?协议(Protocols)与其他 ...

  4. Scala学习1————scala开发环境搭建(windows 10)

    Scala开发环境搭建 先讲几点我学习scala的目的或者原因吧: JVM在企业中的霸主地位,Scala也是JVM上的语言,很有可能未来会从Java过度到Scala也不是不可能. 先进的函数式编程和面 ...

  5. Web Api跨域登录问题

    最近项目第一次尝试使用web api,照搬了一般mvc的Forms登录方式,在和前端对接的时候出现一个问题: 前端使用ajax调用登录接口完成登录后,再调用别的接口,被判断为未登录. 如果直接在浏览器 ...

  6. 移动端弹性滑动以及vue记录滑动位置

    -webkit-overflow-scrolling介绍 -webkit-overflow-scrolling: auto | touch; auto: 普通滚动,当手指从触摸屏上移开,滚动立即停止 ...

  7. avaScript中变量的声明和赋值

    变量是指程序中一个已经命名的存储单元,它的主要作用就是为数据操作提供存放信息的容器.变量是相对常量而言的.常量是一个不会改变的固定值,而变量的值可能会随着程序的执行而改变.变量有两个基本特征,即变量名 ...

  8. 【SQL】INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND

    INTERVAL YEAR TO MONTH: 作为年和月的时间间隔存储 INTERVAL DAY TO SECOND: 作为天.小时.分和秒的时间间隔存储(DAY,HOUR,MINUTE,SECON ...

  9. VHDL之User-defined data types

    VHDL allows the user to define own data types. 1 user-defined integer types -- This is indeed the pr ...

  10. Deutsch lernen (13)

    1.  die Sicherheit, -en  安全(性) Was ist Ihnen wichtiger: Freiheit oder Sicherheit? Wie ist es mit der ...