详解如何从TensorFlow的mnist数据集导出手写体数字图片


Posted in Python onAugust 05, 2019

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

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

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

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
 
import os
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
 
from PIL import Image
 
# 声明图片宽高
rows = 28
cols = 28
 
# 要提取的图片数量
images_to_extract = 8000
 
# 当前路径下的保存目录
save_dir = "./mnist_digits_images"
 
# 读入mnist数据
mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)
 
# 创建会话
sess = tf.Session()
 
# 获取图片总数
shape = sess.run(tf.shape(mnist.train.images))
images_count = shape[0]
pixels_per_image = shape[1]
 
# 获取标签总数
shape = sess.run(tf.shape(mnist.train.labels))
labels_count = shape[0]
 
# mnist.train.labels是一个二维张量,为便于后续生成数字图片目录名,有必要一维化(后来发现只要把数据集的one_hot属性设为False,mnist.train.labels本身就是一维)
#labels = sess.run(tf.argmax(mnist.train.labels, 1))
labels = mnist.train.labels
 
# 检查数据集是否符合预期格式
if (images_count == labels_count) and (shape.size == 1):
  print ("数据集总共包含 %s 张图片,和 %s 个标签" % (images_count, labels_count))
  print ("每张图片包含 %s 个像素" % (pixels_per_image))
  print ("数据类型:%s" % (mnist.train.images.dtype))
 
  # mnist图像数据的数值范围是[0,1],需要扩展到[0,255],以便于人眼观看
  if mnist.train.images.dtype == "float32":
    print ("准备将数据类型从[0,1]转为binary[0,255]...")
    for i in range(0,images_to_extract):
      for n in range(pixels_per_image):
        if mnist.train.images[i][n] != 0:
          mnist.train.images[i][n] = 255
      # 由于数据集图片数量庞大,转换可能要花不少时间,有必要打印转换进度
      if ((i+1)%50) == 0:
        print ("图像浮点数值扩展进度:已转换 %s 张,共需转换 %s 张" % (i+1, images_to_extract))
 
  # 创建数字图片的保存目录
  for i in range(10):
    dir = "%s/%s/" % (save_dir,i)
    if not os.path.exists(dir):
      print ("目录 ""%s"" 不存在!自动创建该目录..." % dir)
      os.makedirs(dir)
 
  # 通过python图片处理库,生成图片
  indices = [0 for x in range(0, 10)]
  for i in range(0,images_to_extract):
    img = Image.new("L",(cols,rows))
    for m in range(rows):
      for n in range(cols):
        img.putpixel((n,m), int(mnist.train.images[i][n+m*cols]))
    # 根据图片所代表的数字label生成对应的保存路径
    digit = labels[i]
    path = "%s/%s/%s.bmp" % (save_dir, labels[i], indices[digit])
    indices[digit] += 1
    img.save(path)
    # 由于数据集图片数量庞大,保存过程可能要花不少时间,有必要打印保存进度
    if ((i+1)%50) == 0:
      print ("图片保存进度:已保存 %s 张,共需保存 %s 张" % (i+1, images_to_extract))
  
else:
  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目录,在该目录下,可以看到如下内容:

详解如何从TensorFlow的mnist数据集导出手写体数字图片

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

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

详解如何从TensorFlow的mnist数据集导出手写体数字图片

详解如何从TensorFlow的mnist数据集导出手写体数字图片

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

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

详解如何从TensorFlow的mnist数据集导出手写体数字图片详解如何从TensorFlow的mnist数据集导出手写体数字图片

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

详解如何从TensorFlow的mnist数据集导出手写体数字图片

猜猜下面这个是什么:

详解如何从TensorFlow的mnist数据集导出手写体数字图片

这是大写的L?不是。

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现绘制树枝简单示例
Jul 24 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
详解用python实现简单的遗传算法
Jan 02 Python
详解python:time模块用法
Mar 25 Python
python图形绘制奥运五环实例讲解
Sep 14 Python
python中property和setter装饰器用法
Dec 19 Python
python实现小程序推送页面收录脚本
Apr 20 Python
Python Map 函数的使用
Aug 28 Python
python批量修改文件名的示例
Sep 27 Python
python中pandas对多列进行分组统计的实现
Jun 18 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 #Python
Django ORM 查询管理器源码解析
Aug 05 #Python
python实现车牌识别的示例代码
Aug 05 #Python
使用python实现滑动验证码功能
Aug 05 #Python
Django 源码WSGI剖析过程详解
Aug 05 #Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 #Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 #Python
You might like
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
ES6正则的扩展实例详解
2017/04/25 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
10款最好的Web开发的 Python 框架
2015/03/18 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
Python异常处理操作实例详解
2018/05/10 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
详解Python学习之安装pandas
2019/04/16 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
总裁办公室主任职责
2014/01/02 职场文书
执行总经理岗位职责
2014/02/03 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
工作收入证明模板
2015/06/12 职场文书
品德与社会教学反思
2016/02/24 职场文书
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python