Tensorflow的Helloword:使用简单Softmax Regression模型来识别Mnist手写数字

来源:互联网 发布:kaggle 知乎 编辑:程序博客网 时间:2024/05/21 06:24

首先准备数据:

import tensorflow.examples.tutorials.mnist.input_datamnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

“one-hot vectors”在这里指的是标签。除了某一位的数字是1以外其余各维度数字都是0。在这里表示成一个只有在第n维度(从0开始)数字为1的10维向量。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。

训练前应该设置的步骤:

首先通过操作符号变量来描述可交互的操作单元:

import tensorflow as tfx = tf.placeholder(tf.float32, [None, 784]) #2维的浮点数张量来表示这些图,张量的形状是[None,784 ]。(784表示输入28*28的像素大小,None表示第个维度可以是任何长度的。)

然后定义权重值和偏置量,方式是使用Variable

W = tf.Variable(tf.zeros([784,10])) #用784维的图片向量乘以W它以得到一个10维的证据值向量b = tf.Variable(tf.zeros([10]))

实现模型:

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

利用交叉熵来做成本函数这里写图片描述,以训练模型:

y_ = tf.palceholder("float", [None, 10]) #为了计算交叉熵,添加一个新的占位符用于输入正确值

计算交叉熵这里写图片描述

cross_entropy = -tf.reduce_sum(y_*tf.log(y)) #tf.reduce_sum 计算张量的所有元素的总和

梯度下降法来降低成本函数:

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) #0.01表示学习速率

运行计算

init = tf.initialize_all_variables() #初始化创建的所有变量sess = tf.Session()sess.run(init) #在会话中启动模型,并初始化变量

开始训练模型:

#模型循环训练1000次,采用随机梯度下降训练for i in ranges(1000)    batch_xs, batch_ys = mnist.train.next_batch(100) #随机抓取训练数据中的100个批处理数据点    sess.run(train_step, feed_dict = {x: batch_xs, y: batch_ys})                                                         

评估模型

#tf.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,tf.argmax(y_,1)代表正确的标签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(accuray, feed_dict = { x:mnist.test.images, y_:mnist.test.labels})

最终识别的结果值应该大约是91%。

0 0