初学tensorflow,对tensorflow中文社区第一个MNISt手写数字识别程序的理解与修改

       前两天开始学tensorflow,看了一些书及文章,对tensorflow有了初步的了解,然后开始对着TensorFlow中文社区的教程开始敲第一个MNIST数据手写数字识别的程序。因为社区教程的源码无法下载,所以我根据文章的内容把代码重新整理了一下,因为社区文章的一些代码有些错误,所以中间也掉过几个坑,现在我把重新整理的代码写出来,中间也有一写自己的理解,希望能对初学者有一些帮助。TensorFlow中文社区MNIST入门文章http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html。完整的基础理论请参考这篇链接。

侵删。

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data

mnist = input_data.read_data_sets("MIN/", one_hot = True)#传入label的数据是one——hot码

"""x一般传入的是图片, y一般传入的是标签值,Variable 。 一个Variable代表一个可修改的张量,
    存在在TensorFlow的用于描述交互性操作的图中。它们可以用于计算输入值,也可以在计算中被修
    改。对于各种机器学习应用,一般都会有模型参数,
   可以用Variable表示。"""

x = tf.placeholder("float", [None, 784], name = 'x')#这是一个占位符,placeholder类,在执行图的时候会传入数据,一幅图像的维数是785,
                                                     #所以一幅图像是一个维数是785的行向量,因为传入的图像数未知 ,所以行数是None

w = tf.Variable(tf.zeros([784, 10]), name = 'w')#建立一个784*10的零矩阵

b = tf.Variable(tf.zeros([10]), name = 'b')#建立一个10维向量

y = tf.nn.softmax(tf.matmul(x, w) + b, name = 'y')#输出概率值,使用softmax回归,具体看笔记

y_ = tf.placeholder("float", [None, 10], name = 'y_')#实际概率分布,向模型输入测试图片的标签值,因为用的是hot-code 所以标签值是一个10维的向量

cross_entroy = -tf.reduce_sum(y_ * tf.log(y), name = 'cross_entroy')#计算交叉熵
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entroy)#对模型进行训练

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1), name = 'correct_prediction')#验证预测值是否和真实值一样
accurcy = tf.reduce_mean(tf.cast(correct_prediction, "float"), name = 'accurcy')#输出准确度

init = tf.initialize_all_variables()#初始化所有变量

sess = tf.Session()
sess.run(init)#执行计算图

for i in range(1000):
	batch_xs, batch_ys = mnist.train.next_batch(100)#从数据包里抓出一百份训练数据
	sess.run(train_step, feed_dict = {x:batch_xs, y_:batch_ys})#向x和y传递图片数据和标签数据


print(sess.run(accurcy, feed_dict = {x: mnist.test.images, y_:mnist.test.labels}))#测试训练后模型的准确率

writer = tf.summary.FileWriter("F://make", sess.graph)#上传计算图
writer.close()

 

TensorFlow拥有一张描述你各个计算单元的图,它可以自动地使用反向传播算法(backpropagation algorithm)来有效地确定你的变量是如何影响你想要最小化的那个成本值的。然后,TensorFlow会用你选择的优化算法来不断地修改变量以降低成本。

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

在这里,我们要求TensorFlow用梯度下降算法(gradient descent algorithm)以0.01的学习速率最小化交叉熵。梯度下降算法(gradient descent algorithm)是一个简单的学习过程,TensorFlow只需将每个变量一点点地往使成本不断降低的方向移动。当然TensorFlow也提供了其他许多优化算法:只要简单地调整一行代码就可以使用其他的算法。

TensorFlow在这里实际上所做的是,它会在后台给描述你的计算的那张图里面增加一系列新的计算操作单元用于实现反向传播算法和梯度下降算法。然后,它返回给你的只是一个单一的操作,当运行这个操作时,它用梯度下降算法训练你的模型,微调你的变量,不断减少成本。

最后这是程序的计算图,对理解程序的运行有一定帮助

初学tensorflow,对tensorflow中文社区第一个MNISt手写数字识别程序的理解与修改_第1张图片

你可能感兴趣的:(初学tensorflow,对tensorflow中文社区第一个MNISt手写数字识别程序的理解与修改)