Tensoflow入门---Mnist(一)

以下内容是我关于《TensorFlow实战_黄文坚》这本书的学习过程,

MNIST是一个非常简单的机器视觉数据集,由几万张28*28像素的手写数字组成,这些图片只包括灰度值信息。

Tensorflow可以直接加载MNIST数据,在spyder中运行下面代码,会在当前.py文件所在的文件夹下生成一个MNIST_data的文件夹,里面有下载的MNIST数据(.gz的压缩文件)。

  mnist数据集训练集有55000个样本,测试集有10000个样本,验证集有5000个样本。每个样本都有对应的标注信息label。

图像是28*28像素的灰度图片,展开成1维的结果,1*784(28*28=784),丢弃了图片的二维结构方面的信息,把图片变成了一个1维向量。label是10维的向量,只有一个值为1,其余为0。

使用softmax regression算法去训练手写数字识别的分类模型。数字是0-9,所以有10个类别。算法会对每个类别估算一个概率,最后取概率最大的那个数字作为模型的输出结果。

Softmax Regression算法是Logistics Regression算法在多分类问题上的推广,主要用于处理多分类问题,其中,任意两个类之间是线性可分的。

 

下面是具体代码加注释,其实代码很少,主要是注释,一行一行敲下来方便我学习

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
#print(mnist.train.images.shape, mnist.train.labels.shape)
#print(mnist.test.images.shape, mnist.test.labels.shape)
#print(mnist.validation.images.shape, mnist.validation.labels.shape)
#print输出结果
#(55000, 784) (55000, 10)
#(10000, 784) (10000, 10)
#(5000, 784) (5000, 10)
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.placeholder(tf.float32, [None, 784])
#创建一个placeholder,即输入数据的地方。第一个参数是数据类型,
#第二个参数[None, 784]代表tensor的shape,也就是数据的尺寸,
#None代表不限条数的输入,784代表每条输入是一个784的向量
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#给softmax regression模型中的weights和biases创建Variable对象
#Variable是用来存储模型参数,可以长期存在并且在每轮迭代中被更新
#把weights和biases全部初始化为0
y = tf.nn.softmax(tf.matmul(x, W)+ b)
#实现softmax regression算法,y=softmax(Wx+b)
#tf.matmul是tensorflow中矩阵乘法函数
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
#定义cross-entropy交叉熵
#对于多分类问题,通常使用cross-entropy作为loss function来描述模型对问题的分类精度
#loss越小,代表模型的分类结果与真实值的偏差越小,也就是模型越准确
#tf.reduce_mean用来对每个batch数据结果求均值
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
#采用随机梯度下降SGD优化算法
#设置学习速率0.5,优化目标为cross_entropy,得到进行训练的操作train_step
tf.global_variables_initializer().run()
#使用全局参数初始化器tf.global_variables_initializer,并直接执行他的run
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    train_step.run({x: batch_xs, y_: batch_ys})
#迭代地执行训练操作train_step
#每次随机从训练集中抽取100条样本构成一个mini-batch,并feed给placeholder
#然后调用train_step对这些样本进行训练
#使用一小部分数据进行随机梯度下降,这样大部分时候比全样本训练的收敛速度快很多
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
#验证模型的准确率
#tf.argmax是从一个tensor中寻找最大值的序号
#tf.argmax(y, 1)是求各个预测的数字中概率最大的那个,
#tf.argmax(y_, 1)是找样本的真是数字类别
#tf.equal是判断预测的数字类别是否就是正确的类别,最后返回计算分类是否正确的操作correct_prediction
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
#统计全部样本预测的accuracy
#需要先用tf.cast将之前correct_prediction输出的bool值转换为float32,再求平均
#将测试数据的特征和label输入评测流程accuracy,计算模型在测试机上的准确率
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))

 

最后的运行结果

所以使用softmax regression对mnist数据进行分类识别,在测试集上的平均准确率91.59%

书上说可达92%左右,也差不多吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值