使用Softmax回归模型训练识别MNIST数据

来源:互联网 发布:远程登陆阿里云服务器 编辑:程序博客网 时间:2024/06/02 02:29

input_data.py:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import gzip
import os
import tempfile
import numpy
import urllib
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets

加载MNIST数据:mnist=input_data.read_data_sets('MNIST_data/',one_hot=True)

mnist是一个轻量级的类。它以Numpy数组的形式存储着训练、校验和测试数据集。同时提供了一个函数,用于在迭代中获取的minibatch。

构建Softmax回归模型:

占位符:我们通过输入图像和目标输出类别创建节点,来开始构建计算图。

x=tf.placeholder(tf.float32,[None,784])

y_=tf.placeholder(tf.float32,[None,10])

变量:为模型定义权重W和偏置b。

W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([10]))

类别预测和损失函数:

回归模型:把向量化后的图片x和权重矩阵W相乘,加上偏置b,然后计算每个分类的softmax概率值。

y=tf.nn.softmax(tf.matmul(x,W)+b)

最小化误差用的损失函数,我们的损失函数时目标类别和预测类别之间的交叉熵。

cross_entropy=-tf.reduce_sum(y_*tf.log(y))

训练模型:

定义好模型和训练用的损失函数,然后用TensorFlow进行训练。TensorFlow知道整个计算图,它可以使用自动微分法找到对于各个变量的损失梯度值。TensorFlow有大量内置的优化算法,这个例子用最速下降法让交叉熵下降,步长为0.01。

train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

这一行代码是用来往计算图上添加一个新操作,其中包括计算梯度,计算每个参数的步长变化,并且计算出新的参数值。返回的train_step操作对象,在运行时胡使用梯度下降来更新参数。因此,整个模型的训练可以通过反复地运行train_step来完成。

for i in range(100):
        batch_xs,batch_ys=mnist.train.next_batch(100)
        sess.run(train_step,feed_dict={x:batch_xs,y_:batch_ys})

每一步迭代,都会加载100个训练样本,然后执行一次train_step,并通过feed_dict将x和y_张量占位符用训练数据替代。

评估模型:

首先找到那些预测正确的标签。tf.argmax是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引就是类别标签。f.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,而tf.argmax(y_,1)代表正确的标签,我们用tf.equal来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)。

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))

计算准确率:accuracy=tf.reduce_mean(tf.cast(correct_prediction,'float'))

测试数据上的准确率:

accuracy.eval(feed_dict={x:mnist.test.images,y_:mnist.test.labels})

阅读全文
0 0