使用TensorFlow训练MNIST数据集

这篇教程主要来源于这本书:《21个项目玩转深度学习 基于TensorFlow的实践详解》
在线阅读:http://yuedu.163.com/book_reader/acc0e605a6b948b9983afcf62e297fba_4

当我们学习编程语言时,第一课通常会学习一个简单的 “Hello World” 程序, 而 MNIST 手写字符识别可以算得上是机器学习界的 “Hello World” 。 MNIST是由 Yann LeCun 等人建立的一个手写字符数据集。它简单易用,是一个很好的入门范例。这篇教程会以 MNIST 数据库为例, 用 TensorFlow 读取数据集中的数据, 并建立一个简单的图像识别模型。

一、MNIST数据集

1、mnist数据集简介

MNIST 数据集主要由一些手写数字的图片和相应的标签组成, 图片一共有 10 类, 分别对应从 0-9, 共10个阿拉伯数字。

在这里插入图片描述
                 MNIST数据集图片示例

原始的 MNIST 数据库一共包含下面 4 个文件:
在这里插入图片描述
在MNIST数据集中有两类图像,一类是训练图像(对应文件train-images-idx3-ubyte.gz和train-labels-idx1-ubyte.gz),另一类是测试图像(对应文件 t10k-images-idx3-ubyte.gz 和 t10k-labels-idx1-ubyte.gz)。训练图像一共有60000张,供我们训练出合适的模型。测试图像一共有10000张,供我们测试训练的模型的性能。 在 TensorFlow 中,可以使用下面的 Python 代码下载 MNIST 数据。

代码中的print只是为了验证一下,下载部分其实只是前几行:

# coding:utf-8
# 从tensorflow.examples.tutorials.mnist引入模块。这是TensorFlow为了教学MNIST而提前编制的程序
from tensorflow.examples.tutorials.mnist import input_data
# 从MNIST_data/中读取MNIST数据。这条语句在数据不存在时,会自动执行下载
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 查看训练数据的大小
print(mnist.train.images.shape)  # (55000, 784)
print(mnist.train.labels.shape)  # (55000, 10)

# 查看验证数据的大小
print(mnist.validation.images.shape)  # (5000, 784)
print(mnist.validation.labels.shape)  # (5000, 10)

# 查看测试数据的大小
print(mnist.test.images.shape)  # (10000, 784)
print(mnist.test.labels.shape)  # (10000, 10)

# 打印出第0幅图片的向量表示
print(mnist.train.images[0, :])

# 打印出第0幅图片的标签
print(mnist.train.labels[0, :])

2.将MNIST数据集保存为图片

在原始的MNIST数据集中,每张图片都由一个28x28的矩阵表示。在TensorFlow中,变量mnist.train.images是训练样本,它的形状为(55000,784)。其中,5000是训练图像的个数,而784实际为单个样本的维数,即每张图片都由一个784维的向量表示(28x28=784)。可以使用下面的Python代码将 MNIST 数据集读取出来,并保存为图片文件。

代码中给出的是保存全部55000张图片,这需要一段时间,大家大可只保存几张,看看就好,在以后的训练中不会用到原图:

# coding: utf-8
from tensorflow.examples.tutorials.mnist import input_data
import scipy.misc
import os

# 读取MNIST数据集。如果不存在会事先下载。
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 我们把原始图片保存在MNIST_data/raw/文件夹下
# 如果没有这个文件夹会自动创建
save_dir = 'MNIST_data/raw/'
if os.path.exists(save_dir) is False:
    os.makedirs(save_dir)

# 保存train训练集全部55000张图片
for i in range(55000):
    # 请注意,mnist.train.images[i, :]就表示第i张图片(序号从0开始)
    image_array = mnist.train.images[i, :]
    # TensorFlow中的MNIST图片是一个784维的向量,我们重新把它还原为28x28维的图像。
    image_array = image_array.reshape(28, 28)
    # 保存文件的格式为 mnist_train_0.jpg, mnist_train_1.jpg, ... ,mnist_train_19.jpg
    filename = save_dir + 'mnist_train_%d.jpg' % i
    # 将image_array保存为图片
    # 先用scipy.misc.toimage转换为图像,再调用save直接保存。
    scipy.misc.toimage(image_array, cmin=0.0, cmax=1.0).save(filename)

print('Please check: %s ' % save_dir)

3、图像标签的独热表示

变量mnist.train.labels表示训练图像的标签,它的形状是(55000,10)。原始的图像标签是数字0-9,我们完全可以用一个数字来存储图像标签,但为什么这里每个训练标签是一个10维的向量呢?其实,这个10维的向量是原先类别号的独热(one-hot)表示。所谓独热表示,就是“一位有效编码”。我们用N维的向量来表示N个类别,每个类别占据独立的一位,任何时候独热表示中只有一位是“1”,其他都为“0”。我们可以从下面这个表格中理解独热表示:
在这里插入图片描述
              类别的原始表示和独热表示

我们可以用下面的代码打印出前20张图片的标签,我们可以与刚才保存的图片对照,查看图像与图像的标签是否对应正确。

这次就更没有必要打印出所有的图片的标签了:

# coding: utf-8
from tensorflow.examples
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值