Tensorflow教程(四)——MNIST项目入门

MNIST数据集

MNIST是在机器学习领域中的一个经典问题,该问题解决的是把28x28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9。下载链接:
MNIST handwritten digit database:http://yann.lecun.com/exdb/mnist/
在这里插入图片描述
正如上边图片中所示,上边图片中分别为5、0、4、1四个数字,我们人眼是会很快将其识别出来,我们训练目的是通过训练让机器可以自己识别出来这些数字。
在这里插入图片描述
我们每写的一个数字都会被设置为2828的像素点,会根据该点颜色的深浅设置0到1之间的数值。当某个像素点的颜色特别深的时候我们就认定该点的数值为1,当颜色比较浅的时候我们就会减小数值的大小,直至该点没有笔画我们设置该点数值为0。所以在MNIST数据集中每一个数字就是一个2828的矩阵。

下边是MNIST数据集四个文件的介绍,可以有一个大概了解。

文件名大小备注
train-images-idx3-ubyte.gz9.45M训练集图片 - 55000 张 训练图片, 5000 张 验证图片
train-labels-idx1-ubyte.gz28.2k训练集图片对应的数字标签
t10k-images-idx3-ubyte.gz1.57M测试集图片 - 10000 张 图片
t10k-labels-idx1-ubyte.gz4.43k测试集图片对应的数字标签

Softmax

来直接二话不说,上公式:

s o f t m a x ( x ) i = e x i ∑ j e x j softmax(x)_i = \frac{e^{x_i}}{\sum_j{e^{x_j}}} softmax(x)i=jexjexi

看不清楚没有关系,再补一个:
在这里插入图片描述
softmax模型又被称为归一化指数函数,可以用来给不同的对象分配概率。Softmax函数实际上是有限项离散概率分布的梯度对数归一化。简单地说,就是将一个元素作为自然数的指数,除以所有元素的这个数值。

在这里插入图片描述

Softmax函数在包括多项逻辑回归,多项线性判别分析,朴素贝叶斯分类器和人工神经网络等的多种基于概率的多分类问题方法中都有着广泛应用。它能够将一个不同大小数值的向量压缩到0到1之间,能够很方便观察数值。

程序介绍

导入数据库

import tensorflow as tf
import input_data

第一行程序大家都比较熟悉,是TensorFlow常用的申明。
第二行程序是MNIST数据集一个辅助程序。可以通过下边的链接进行下载,与该教程的程序放在同一目录下就是可以的。
百度云盘:https://pan.baidu.com/s/1qAQ4bP9dfBdEA3XMah8fww

加载数据

mnist = input_data.read_data_sets('Mnist_data', one_hot=True)

不要小看这一行程序,虽然这行程序只有一个,就是调用 input_data.py 中 read_data_sets 函数,但是还是很强大的,它首先会判断当前目录是否已经下载了MNIST数据集,如果没有下载会首先下载该数据集。下载以后开始进行解压,解压以后再去加载数据集,将数据集加载给mnist变量。

变量设置

# 创建占位符x,大小为28*28=784
x = tf.placeholder("float", [None, 784])

首先是占位符x,因为每幅图片归一化为 28 ∗ 28 28*28 2828的数值,我们会将它存储为 1 ∗ 784 1*784 1784的张量。所以x其中一维信息为784,还有一维是根据每次训练数据的大小来定的,这个需要根据具体训练设置来进行变化。

#  使用Variable创建可修改的W、b张量
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

接着是使用Variable创建可修改的W、b张量,因为是 x ∗ W + b x*W+b xW+b,所以 W W W的一维信息跟 x x x保持一致为 784 784 784。而另一维信息为输出结果为0到9十个数字可能性,所以另一维为10。所以W就为[784,10]。而 b 是0-9每一个数字才会有一个偏置,所以 b 为[10].

# y=softmax(Wx+b)
y = tf.nn.softmax(tf.matmul(x, W)+b)
# 添加一个新的占位符用于输入正确值
y_ = tf.placeholder("float", [None, 10])

接着是对 公式 y = s o f t m a x ( W x + b ) y=softmax(Wx+b) y=softmax(Wx+b) 进行描述。借助函数tf.nn.softmax()可以对其进行直接地求解。同时在后边创建一个正确的变量y_,后边会应用它来与 y 比较查看训练效果。

# 计算交叉熵
# 用tf.reduce_sum 计算张量的所有元素的总和
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# 以0.01的学习速率最小化交叉熵
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

使用函数tf.log()计算TensorFlow的自然对数,使用函数tf.reduce_sum() 计算张量的所有元素的总和。设置以0.01的学习速率最小化交叉熵进行学习,这个函数仅仅是一个简单训练策略,后期我们会继续介绍其它的方法,仅仅是需要修改这一行代码就是可以的,非常方便。

# 在Session里面启动模型
sess = tf.Session()
# 初始化变量
init = tf.initialize_all_variables()
sess.run(init)

上边的程序我们就会比较熟悉的,就是我们在前边看到的启动会话、初始化变量需要的程序。

进行训练

for i in range(1000):
    # 随机抓取训练数据中的100个批处理数据点
    batch_xs, batch_ys = mnist.train.next_batch(100)
    # 用这些数据点作为参数替换之前的占位符来运行train_step
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

在这里我们能够看到设置训练1000代,每次我们会借助TensorFlow中train.next_batch(100)函数从MNIST数据集中选取100个数据进行训练。batch_xs是获取的训练数据,batch_ys为该批数据的训练标签。

接着使用sess.run()函数对此次抽取的100个数据进行训练。

准确率评估

# 检测预测是否与实际标签匹配,返回一组布尔值
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
# 把布尔值转换成浮点数,然后取平均值
# [True, False, True, True]变成[1,0,1,1],平均后得0.75
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
# 计算所学习到的模型在测试数据集上面的正确率
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

tf.argmax(vector, 1) 返回的是vector中的最大值的索引号,如果vector是一个向量,那就返回一个值,如果是一个矩阵,那就返回一个向量,这个向量的每一个维度都是相对应矩阵行的最大值元素的索引号。也就是判断y输出的softmax以后的数值中最大值的索引为多少。使用tf.equal()判断两者是否相等。此时相等就会输出True,不相等就会输出False。
tf.cast()函数是将布尔型数值转换为floa数值,就是将True转换为1.0,False转换为0.0。接着使用tf.reduce_mean()求出平均值,将其作为我们求解的正确率。
最后打印sess.run()函数进行测试的数据集结果,就是我们训练模型进行识别准确率的大小。

总程序

下边是整体程序,不要忘记下载input_data.py

#!/usr/bin/python
# coding:utf-8

import tensorflow as tf
import input_data
# 加载数据
mnist = input_data.read_data_sets('Mnist_data', one_hot=True)


# 创建占位符x,大小为28*28=784,因为每次训练的数据量不知道,所以另一位信息暂时不知道
x = tf.placeholder("float", [None, 784])
#  使用Variable创建可修改的W、b张量
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# y=softmax(Wx+b)
y = tf.nn.softmax(tf.matmul(x, W)+b)
# 添加一个新的占位符用于输入正确值
y_ = tf.placeholder("float", [None, 10])
# 计算交叉熵
# 用tf.reduce_sum 计算张量的所有元素的总和
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# 以0.01的学习速率最小化交叉熵
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# 在Session里面启动模型
sess = tf.Session()
# 初始化变量
init = tf.initialize_all_variables()
sess.run(init)

# 让模型循环训练1000次
for i in range(10000):
    # 随机抓取训练数据中的100个批处理数据点
    batch_xs, batch_ys = mnist.train.next_batch(100)
    # 用这些数据点作为参数替换之前的占位符来运行train_step
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

# 检测预测是否与实际标签匹配,返回一组布尔值
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
# 把布尔值转换成浮点数,然后取平均值
# [True, False, True, True]变成[1,0,1,1],平均后得0.75
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
# 计算所学习到的模型在测试数据集上面的正确率
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值