在TensorFlow的官方入门课程中,多次用到mnist数据集。

mnist数据集是一个数字手写体图片库,但它的存储格式并非常见的图片格式,所有的图片都集中保存在四个扩展名为idx3-ubyte的二进制文件。

如果我们想要知道大名鼎鼎的mnist手写体数字都长什么样子,就需要从mnist数据集中导出手写体数字图片。了解这些手写体的总体形状,也有助于加深我们对TensorFlow入门课程的理解。

下面先给出通过TensorFlow api接口导出mnist手写体数字图片的python代码,再对代码进行分析。代码在win7下测试通过,linux环境也可以参考本处代码。

(非常良心的注释和打印有木有)

  1. #!/usr/bin/python3.5
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import tensorflow as tf
  5. from tensorflow.examples.tutorials.mnist import input_data
  6. from PIL import Image
  7. # 声明图片宽高
  8. rows = 28
  9. cols = 28
  10. # 要提取的图片数量
  11. images_to_extract = 8000
  12. # 当前路径下的保存目录
  13. save_dir = "./mnist_digits_images"
  14. # 读入mnist数据
  15. mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)
  16. # 创建会话
  17. sess = tf.Session()
  18. # 获取图片总数
  19. shape = sess.run(tf.shape(mnist.train.images))
  20. images_count = shape[0]
  21. pixels_per_image = shape[1]
  22. # 获取标签总数
  23. shape = sess.run(tf.shape(mnist.train.labels))
  24. labels_count = shape[0]
  25. # mnist.train.labels是一个二维张量,为便于后续生成数字图片目录名,有必要一维化(后来发现只要把数据集的one_hot属性设为False,mnist.train.labels本身就是一维)
  26. #labels = sess.run(tf.argmax(mnist.train.labels, 1))
  27. labels = mnist.train.labels
  28. # 检查数据集是否符合预期格式
  29. if (images_count == labels_count) and (shape.size == 1):
  30. print ("数据集总共包含 %s 张图片,和 %s 个标签" % (images_count, labels_count))
  31. print ("每张图片包含 %s 个像素" % (pixels_per_image))
  32. print ("数据类型:%s" % (mnist.train.images.dtype))
  33. # mnist图像数据的数值范围是[0,1],需要扩展到[0,255],以便于人眼观看
  34. if mnist.train.images.dtype == "float32":
  35. print ("准备将数据类型从[0,1]转为binary[0,255]...")
  36. for i in range(0,images_to_extract):
  37. for n in range(pixels_per_image):
  38. if mnist.train.images[i][n] != 0:
  39. mnist.train.images[i][n] = 255
  40. # 由于数据集图片数量庞大,转换可能要花不少时间,有必要打印转换进度
  41. if ((i+1)%50) == 0:
  42. print ("图像浮点数值扩展进度:已转换 %s 张,共需转换 %s 张" % (i+1, images_to_extract))
  43. # 创建数字图片的保存目录
  44. for i in range(10):
  45. dir = "%s/%s/" % (save_dir,i)
  46. if not os.path.exists(dir):
  47. print ("目录 ""%s"" 不存在!自动创建该目录..." % dir)
  48. os.makedirs(dir)
  49. # 通过python图片处理库,生成图片
  50. indices = [0 for x in range(0, 10)]
  51. for i in range(0,images_to_extract):
  52. img = Image.new("L",(cols,rows))
  53. for m in range(rows):
  54. for n in range(cols):
  55. img.putpixel((n,m), int(mnist.train.images[i][n+m*cols]))
  56. # 根据图片所代表的数字label生成对应的保存路径
  57. digit = labels[i]
  58. path = "%s/%s/%s.bmp" % (save_dir, labels[i], indices[digit])
  59. indices[digit] += 1
  60. img.save(path)
  61. # 由于数据集图片数量庞大,保存过程可能要花不少时间,有必要打印保存进度
  62. if ((i+1)%50) == 0:
  63. print ("图片保存进度:已保存 %s 张,共需保存 %s 张" % (i+1, images_to_extract))
  64. else:
  65. print ("图片数量和标签数量不一致!")

上述代码的实现思路如下:

1.读入mnist手写体数据;

2.把数据的值从[0,1]浮点范围转化为黑白格式(背景为0-黑色,前景为255-白色);

3.根据mnist.train.labels的内容,生成数字索引,也就是建立每一张图片和其所代表数字的关联,由此创建对应的保存目录;

4.循环遍历mnist.train.images,把每张图片的像素数据赋值给python图片处理库PIL的Image类实例,再调用Image类的save方法把图片保存在第3步骤中创建的对应目录。

在运行上述代码之前,你需要确保本地已经安装python的图片处理库PIL,pip安装命令如下:

pip3 install Pillow

或 pip install Pillow,取决于你的pip版本。

上述python代码运行后,在当前目录下会生成mnist_digits_images目录,在该目录下,可以看到如下内容:

可以看到,我们成功地生成了黑底白字的数字图片。

如果仔细观察这些图片,会看到一些肉眼也难以分辨的数字,譬如:

上面这几个数字是2。想不到吧?

下面这两个是5(看起来更像6):

这个是7:(7长这样?有句MMP不知当讲不当讲)

猜猜下面这个是什么:

这是大写的L?不是。

有点像1,是1吗?也不是。

倒立拉粑的7?sorry,又猜错了。

实话告诉您,它是2!一开始我也是不相信的,知道真相的那一刻我下巴差点掉下来!

这些手写图片,一般人用肉眼观察,识别率能达到98%就不错了,但是通过TensorFlow搭建的卷积神经网络识别率可以达到99%,非常地神奇!

导出MNIST的数据集的更多相关文章

  1. 使用 MNIST 图像识别数据集

    机器学习领域中最迷人的主题之一是图像识别 (IR). 使用红外系统的示例包括使用指纹或视网膜识别的计算机登录程序和机场安全系统的扫描乘客脸寻找某种通缉名单上的个人.MNIST 数据集是可用于实验的简单 ...

  2. 学习笔记TF056:TensorFlow MNIST,数据集、分类、可视化

    MNIST(Mixed National Institute of Standards and Technology)http://yann.lecun.com/exdb/mnist/ ,入门级计算机 ...

  3. MNIST机器学习数据集

    介绍 在学习机器学习的时候,首当其冲的就是准备一份通用的数据集,方便与其他的算法进行比较.在这里,我写了一个用于加载MNIST数据集的方法,并将其进行封装,主要用于将MNIST数据集转换成numpy. ...

  4. 关于无法下载sklearn中的MNIST original数据集的问题

    在使用Sklearn进行加载自带的数据集MNIST时,总是报错,代码及相应的错误显示如下: from sklearn.datasets import fetch_mldata mnist = fetc ...

  5. softmax_regression完成mnist手写体数据集的识别

    ---恢复内容开始--- import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnis ...

  6. 详解 MNIST 数据集

    转自:https://blog.csdn.net/simple_the_best/article/details/75267863 MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它 ...

  7. Windows下mnist数据集caffemodel分类模型训练及测试

    1. MNIST数据集介绍 MNIST是一个手写数字数据库,样本收集的是美国中学生手写样本,比较符合实际情况,大体上样本是这样的: MNIST数据库有以下特性: 包含了60000个训练样本集和1000 ...

  8. Keras学习:第一个例子-训练MNIST数据集

    import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...

  9. 深度学习(一)之MNIST数据集分类

    任务目标 对MNIST手写数字数据集进行训练和评估,最终使得模型能够在测试集上达到\(98\%\)的正确率.(最终本文达到了\(99.36\%\)) 使用的库的版本: python:3.8.12 py ...

随机推荐

  1. TCP/IP解析(一):TCP/IP的工作方式

    本文包括下面内容: 1.TCP/IP协议系统 2.OSI模型 3.数据包 4.TCP/IP的交互方式 1.TCP/IP模型的协议层 分为四层: 网络訪问层:提供与物理网络连接的接口.依据硬件的物理地址 ...

  2. 微信企业号开发:UserAgent

    userAgent 属性是一个仅仅读的字符串,声明了浏览器用于 HTTP 请求的用户代理头 的值.微信企业号的打开网页的userAgent又包括那些信息呢? 使用userAgent能够推断用户訪问的浏 ...

  3. LeetCode: Word Ladder [126]

    [题目] Given two words (start and end), and a dictionary, find the length of shortest transformation s ...

  4. Ubuntu Tomcat Service

    只需要将%TOMCAT_HOME%/bin/catalina.sh文件拷贝到/etc/init.d/文件夹下,稍作编辑,然后注册成系统服务,是否设置自启动均可. 1. 编辑catalina.sh文件c ...

  5. hdoj--3339--In Action(最短路+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 最详细的CentOS 6与7对比(三):性能测试对比

    本主题将从3个角度进行对比 常见设置(CentOS 6 vs CentOS 7) 服务管理(Sysvinit vs Upstart vs Systemd) 性能测试(cpu/mem/io/oltp) ...

  7. 给统计人讲Python(1)_科学计算库-Numpy

    本地代码是.ipynb格式的转换到博客上很麻烦,这里展示部分代码,了解更多可以查看我的git-hub:https://github.com/Yangami/Python-for-Statisticia ...

  8. Java设计模式-策略模式详解

    前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...

  9. rsync文件备份同步

    1.rsync有两种认证协议: ssh认证协议 rsync server端不需要启动daemon进程,所以不用配置/etc/rsyncd.conf,只需要获取远程host的用户名密码 例: rsync ...

  10. 有关PHP里的Cookie

    会话技术:Cookie,Session: Cookie是客户端技术,服务器把每个用户的数据以Cookie的形式保存在用户各自的浏览器,当用户用浏览器再次访问服务器的web资源时则会带着各自的数据去了: ...