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

在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目录,在该目录下,可以看到如下内容:

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

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

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

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

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

猜猜下面这个是什么:

这是大写的L?不是。

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

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

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

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

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

(0)

相关推荐

  • tensorflow实现加载mnist数据集

    mnist作为最基础的图片数据集,在以后的cnn,rnn任务中都会用到 import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from tensorflow.examples.tutorials.mnist import input_data #数据集存放地址,采用0-1编码 mnist = input_data.read_data_sets('F:/mnist/data/',one_hot = Tr

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

    在TensorFlow的官方入门课程中,多次用到mnist数据集. mnist数据集是一个数字手写体图片库,但它的存储格式并非常见的图片格式,所有的图片都集中保存在四个扩展名为idx3-ubyte的二进制文件. 如果我们想要知道大名鼎鼎的mnist手写体数字都长什么样子,就需要从mnist数据集中导出手写体数字图片.了解这些手写体的总体形状,也有助于加深我们对TensorFlow入门课程的理解. 下面先给出通过TensorFlow api接口导出mnist手写体数字图片的python代码,再对代

  • TensorFlow基于MNIST数据集实现车牌识别(初步演示版)

    在前几天写的一篇博文<如何从TensorFlow的mnist数据集导出手写体数字图片>中,我们介绍了如何通过TensorFlow将mnist手写体数字集导出到本地保存为bmp文件. 车牌识别在当今社会中广泛存在,其应用场景包括各类交通监控和停车场出入口收费系统,在自动驾驶中也得到一定应用,其原理也不难理解,故很适合作为图像处理+机器学习的入门案例. 现在我们不妨酝酿一个大胆的想法:在TensorFlow中通过卷积神经网络+mnist数字集实现车牌识别. 实际上车牌字符除了数字0-9,还有字母A

  • 详解如何用TensorFlow训练和识别/分类自定义图片

    很多正在入门或刚入门TensorFlow机器学习的同学希望能够通过自己指定图片源对模型进行训练,然后识别和分类自己指定的图片.但是,在TensorFlow官方入门教程中,并无明确给出如何把自定义数据输入训练模型的方法.现在,我们就参考官方入门课程<Deep MNIST for Experts>一节的内容(传送门:https://www.tensorflow.org/get_started/mnist/pros),介绍如何将自定义图片输入到TensorFlow的训练模型. 在<Deep M

  • 基于Tensorflow读取MNIST数据集时网络超时的解决方式

    最近在学习TensorFlow,比较烦人的是使用tensorflow.examples.tutorials.mnist.input_data读取数据 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('/temp/mnist_data/') X = mnist.test.images.reshape(-1, n_steps, n_inputs) y = mnis

  • PyTorch实现MNIST数据集手写数字识别详情

    目录 一.PyTorch是什么? 二.程序示例 1.引入必要库 2.下载数据集 3.加载数据集 4.搭建CNN模型并实例化 5.交叉熵损失函数损失函数及SGD算法优化器 6.训练函数 7.测试函数 8.运行 三.总结 前言: 本篇文章基于卷积神经网络CNN,使用PyTorch实现MNIST数据集手写数字识别. 一.PyTorch是什么? PyTorch 是一个 Torch7 团队开源的 Python 优先的深度学习框架,提供两个高级功能: 强大的 GPU 加速 Tensor 计算(类似 nump

  • 详解Java如何实现百万数据excel导出功能

    目录 前言 1.异步处理 1.1 使用job 1.2 使用mq 2.使用easyexcel 3.分页查询 4.多个sheet 5.计算limit的起始位置 6.文件上传到OSS 7.通过WebSocket推送通知 8.总条数可配置 9.order by商品编号 总结 前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在UI界面上点击全部导出按钮,就能导

  • 详解Python使用tensorflow入门指南

    TensorFlow是Google公司2015年11月开源的第二代深度学习框架,是第一代框架DistBelief的改进版本. TensorFlow支持python和c/c++语言, 可以在cpu或gpu上进行运算, 支持使用virtualenv或docker打包发布. 定义变量 为了使用tensorflow,首先我们需要导入它 import tensorflow as tf 对于符号变量,我们新建一个 x = tf.placeholder(tf.float32, [None, 784]) 这里x

  • 详解Anaconda安装tensorflow报错问题解决方法

    最近脱离了googlecolab想使用本地的anaconda进行机器学习课题的演练,在安装tensorflow时报错 : UnsatisfiableError: The following specifications were found.下面给出解决方法. 发现实际原因是由于anaconda的python环境,当前版本的tensorflow只能适用于python 3.5 3.6 3.7等衍生版本,而anaconda自带的python版本为3.8. 首先打开控制台 使用以下命令可以查看当前的a

  • 详解AngularJS中module模块的导入导出

    AngularJS是一款来自Google的前端JS框架,它的核心特性有:MVC.双向数据绑定.指令和语义化标签.模块化工具.依赖注入.HTML模板,以及对常用工具的封装,例如$http.$cookies.$location等. 关于AngularJS中module的导入导出,在Bob告诉我之前还没写过,谢谢Bob在这方面的指导,给到我案例代码. 在AngularJS实际项目中,我们可能需要把针对某个领域的各个方面放在不同的module中,然后把各个module汇总到该领域的一个文件中,再由主mo

  • 详解thinkphp实现excel数据的导入导出(附完整案例)

    实现步骤: 一:在http://phpexcel.codeplex.com/下载最新PHPExcel放到Vendor下,注意位置:ThinkPHP\Extend\Vendor\PHPExcel\PHPExcel.php. 二:导出excel代码实现 /**方法**/ function index(){ $this->display(); } public function exportExcel($expTitle,$expCellName,$expTableData){ $xlsTitle =

随机推荐