在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_datafrom 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] += 1img.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目录,在该目录下,可以看到如下内容:

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

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

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

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

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

猜猜下面这个是什么:

这是大写的L?不是。

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

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

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

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

如何从TensorFlow的mnist数据集导出手写体数字图片相关推荐

  1. TensorFlow读取MNIST数据集错误的问题

    TensorFlow读取mnist数据集错误的问题 运行程序出现"URLError"错误的问题 可能是服务器或路径的原因,可以自行下载数据集后,将数据集放到代码所在的文件夹下,并将 ...

  2. 机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)

    机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)

  3. 基于tensorflow+RNN的MNIST数据集手写数字分类

    2018年9月25日笔记 tensorflow是谷歌google的深度学习框架,tensor中文叫做张量,flow叫做流. RNN是recurrent neural network的简称,中文叫做循环 ...

  4. 基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

    基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

  5. Python+TensorFlow+PyQt实现手写体数字图片识别+GUI界面+画板数字识别

    __pycache__文件夹是Python自动生成的,详细了解https://blog.csdn.net/yitiaodashu/article/details/79023987 其他各个文件在之后部 ...

  6. MNIST数据集手写数字分类

    参考   MNIST数据集手写数字分类 - 云+社区 - 腾讯云 目录 0.编程环境 1.下载并解压数据集 2.完整代码 3.数据准备 4.数据观察 4.1 查看变量mnist的方法和属性 4.2 对 ...

  7. [Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  8. Python实现手写体数字图片识别+GUI界面+画板数字识别

    __pycache__文件夹是Python自动生成的,详细了解https://blog.csdn.net/yitiaodashu/article/details/79023987 其他各个文件在之后部 ...

  9. GAN网络生成手写体数字图片

    Keras真香,以前都是用tensorflow来写神经网络,自从用了keras,发现这个Keras也蛮方便的. 目前感觉keras的优点就是方便搭建基于标准网络组件的神经网络,这里的网络组件包括全连接 ...

最新文章

  1. 在C#中利用SharpZipLib进行文件的压缩和解压缩
  2. 两个字符串的删除操作
  3. android中按一个按钮弹出字,允许用户在Android中长按一次即可编辑按钮文字
  4. 2019年最流行的10个前端框架
  5. step-by-step: 夕小瑶版神经网络调参指南(上)
  6. 混合模型简介与高斯混合模型
  7. 山师计算机应用技术试题和答案,山师计算机应用技术的试题和答案.doc
  8. is_numeric 检测变量是否为数字或数字字符串
  9. c语言创建json串,Jquery通过JSON字符串创建JSON对象
  10. android ble 蓝牙绑定流程,BLE 配对与绑定过程详细解析
  11. Dom4j完整教程,操作XML教程
  12. 2020-10-18 工资管理系统需求分析报告
  13. 转载——巨详细的MD5加盐,大佬详解
  14. 国内DDOS防御的专业防火墙技术
  15. 忘记电脑开机密码怎么办?六种方法教你解决
  16. Qt 弹出对话框选择图片并显示
  17. 【资源】公开的电子书 合集 (计算机相关、多高清、pdf)
  18. 阿拉伯数字金额转汉字大写
  19. 下载学习通上没有下载权限的文件
  20. zcmu 1603 卡斯丁狗的战舰帝国(并查集+模拟)

热门文章

  1. 文献翻译神器---助你轻松阅读理解英文文献论文
  2. 【增长的数字(仿支付宝资产数字)】
  3. 如何在Ubuntu上轻松截图
  4. 域名注册和使用相关问题的解答
  5. 拉格朗日中值定理的应用
  6. 【Android自动化测试】Ui Automator技术(以对QQ软件自动发说说为例)
  7. 关于sublime无法安装Package Controll
  8. Android Audio播放流程详解
  9. 格林函数(Green’s function)
  10. 对比学习的一个原则3个关键点