导出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%,非常地神奇!
导出MNIST的数据集的更多相关文章
- 使用 MNIST 图像识别数据集
机器学习领域中最迷人的主题之一是图像识别 (IR). 使用红外系统的示例包括使用指纹或视网膜识别的计算机登录程序和机场安全系统的扫描乘客脸寻找某种通缉名单上的个人.MNIST 数据集是可用于实验的简单 ...
- 学习笔记TF056:TensorFlow MNIST,数据集、分类、可视化
MNIST(Mixed National Institute of Standards and Technology)http://yann.lecun.com/exdb/mnist/ ,入门级计算机 ...
- MNIST机器学习数据集
介绍 在学习机器学习的时候,首当其冲的就是准备一份通用的数据集,方便与其他的算法进行比较.在这里,我写了一个用于加载MNIST数据集的方法,并将其进行封装,主要用于将MNIST数据集转换成numpy. ...
- 关于无法下载sklearn中的MNIST original数据集的问题
在使用Sklearn进行加载自带的数据集MNIST时,总是报错,代码及相应的错误显示如下: from sklearn.datasets import fetch_mldata mnist = fetc ...
- softmax_regression完成mnist手写体数据集的识别
---恢复内容开始--- import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnis ...
- 详解 MNIST 数据集
转自:https://blog.csdn.net/simple_the_best/article/details/75267863 MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它 ...
- Windows下mnist数据集caffemodel分类模型训练及测试
1. MNIST数据集介绍 MNIST是一个手写数字数据库,样本收集的是美国中学生手写样本,比较符合实际情况,大体上样本是这样的: MNIST数据库有以下特性: 包含了60000个训练样本集和1000 ...
- Keras学习:第一个例子-训练MNIST数据集
import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...
- 深度学习(一)之MNIST数据集分类
任务目标 对MNIST手写数字数据集进行训练和评估,最终使得模型能够在测试集上达到\(98\%\)的正确率.(最终本文达到了\(99.36\%\)) 使用的库的版本: python:3.8.12 py ...
随机推荐
- Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数
Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数 学习了:http://www.importnew.com/14958.html 膜拜一下 源码膜拜: Threa ...
- swift 笔记 (十四) —— 构造过程
构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们一般会定义一个方法来完毕,这种方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作 ...
- TRIZ系列-创新原理-8-重量补偿原理
重量补偿原理的表述例如以下: 1)将某一物体与还有一种提供上升力的物体组合,以补偿其重量:2)通过与环境(利用空气动力,流体动力或其他力等)的相互作用.实现对物体的重量补偿: 重力使得我们能够稳稳的依 ...
- Android开发之BUG专讲:入门篇(一)
前言: 本文作者:周才智 转载须注明作者与出处.违者必究. 原文地址:http://segmentfault.com/a/1190000004380690 话说诸葛亮是一个优秀的程序员,每个锦囊都是应 ...
- Linux中的默认权限与隐藏权限(文件、文件夹)
一个文件(或文件夹)拥有若干个属性.包含(r/w/x)等基本属性,以及是否为文件夹(d)与文件(-)或连接文件(l)等属性.此外,Linux还能够设置其它系统安全属性.使用chattr来设置.以lsa ...
- c27---typedef
// // main.c // typedef #include <stdio.h> /* typedef可以给一个已知的数据类型起别名. typedef 原有的数据类型 别名; 注意: ...
- day63-webservice 08.在web项目中配置带有接口的webservice服务
这个是配置带有接口的WebService的服务. http://localhost:8080/cxf-web-server/service 带有接口的实现类也给它做好了.jaxws:endpoint是 ...
- ubuntu刚安装好之后apt-get使用异常
gaozhang 刚安装好之后,想执行apt-get update 任务,出现以下错误提示 提示说明apt正在执行,我们就野蛮的将apt进程杀.死即可,不过有点多,一个个kill 执行完之后再 ...
- Vue2.0框架搭建基础操作及目录说明
一.概述 vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组件和v ...
- .net中的TreeView的数据绑定与EasyUi_tree的数据绑定
昨天看到了.net中的TreeView,学习了一波TreeView的数据绑定,联想到EasyUi中的Tree的数据,觉得里面的逻辑差不多,就总结了一下两者的数据绑定. 前端页面和必要的JS如下 < ...