侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

技术  /  管理员 发布于 7年前   269

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

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

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

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

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

#!/usr/bin/python3.5# -*- coding: utf-8 -*- import osimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data from PIL import Image # 声明图片宽高rows = 28cols = 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%,非常地神奇!

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


  • 上一条:
    详解如何用TensorFlow训练和识别/分类自定义图片
    下一条:
    matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客