tensorflow学习笔记之MNIST入门

来源:互联网 发布:网络暴力调查报告配图 编辑:程序博客网 时间:2024/06/05 07:02

翻译来自http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html,我只挑选了一些我认为比较重要的做了摘抄并加上了自己的理解,若需要完整的教学,直接看这个网站就好了。
1、MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
这里写图片描述
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。
2、建议在读这篇教程的时候先去上网学习一下神经网络相关知识,还有前向后向传播算法,BP算法什么的,会对理解有很大的帮助。
3、如果已经对神经网络有一定了解,就会知道教程中一大部分都是讲的一个简单的机器学习过程。总体的过程就是
1)为了得到一张给定图片属于某个特定数字类的证据(evidence),我们对图片像素值进行加权求和。如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。红色负数权值,蓝色正数权值。
这里写图片描述
2)这里写图片描述
对输入的图片的像素数据做一个加权求和,w是权值矩阵,因为有干扰因素,所以加上了偏置b。
3)对以上得到的evidence用激活函数进行激活。这里的激活函数是softmax函数。这个函数在Andrew Ng的Cs229的第4个lecture中有讲。大概就是用来把输入归入1..k这些类别中。然后计算参数也就是计算某个输入是第i类的方法就是
这里写图片描述
模型基本上就是这样了。
4)然后就可以开始训练了,训练的时候由于我们是来优化模型,要定义一个指标才能知道模型好不好,这里用交叉熵成本函数来评判(如果不是想搞太多研究的话,可以不去细究这个函数)
这里写图片描述
y 是我们预测的概率分布, y’ 是实际的分布(我们输入的one-hot vector)。比较粗糙的理解是,交叉熵是用来衡量我们的预测用于描述真相的低效性。
5)知道模型,知道成本函数了以后,用梯度下降算法来优化参数,降低成本函数。
6)上面一直都是在用训练数据集来优化参数,优化完成后,还要用测试数据集来看一下正确率是多少。
总体的训练差不多就是这样
下面就是tf编码过程了。
4、要先从http://yann.lecun.com/exdb/mnist/网站下载四组数据,然后把数据放在文件所在文件夹里才能正常导入数据。而对于placeholder等,若不明白,可以参考http://blog.csdn.net/Ema1997/article/details/72801479我之前写的博客,或者直接去官网查看

from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_function__author__ = 'Google and Emma Guo'import tensorflow as tfimport numpy as npimport osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调入数据from tensorflow.examples.tutorials.mnist import input_datamnist=input_data.read_data_sets('.',one_hot=True)#建立一个placeholder一会用来存储输入数据x = tf.placeholder(tf.float32, [None, 784])#W是权值矩阵,b是偏置量向量W = tf.Variable(tf.zeros([784,10]))b = tf.Variable(tf.zeros([10]))#y是模型预测出的概率分布,y_是实际的概率分布,cross_entropy是成本函数交叉熵y = tf.nn.softmax(tf.matmul(x,W) + b)y_ = tf.placeholder("float", [None,10])cross_entropy = -tf.reduce_sum(y_*tf.log(y))#用下面这步函数训练参数,使得成本函数逐渐减小,梯度下降的步长是0.01train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)#对所有变量初始化,很重要init = tf.global_variables_initializer()sess = tf.Session()sess.run(init)#按上面的模型训练1000次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})#tf.argmax 是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))#为了确定正确预测项的比例,我们可以把布尔值转换成浮点数,然后取平均值accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))#最后,我们计算所学习到的模型在测试数据集上面的正确率。print (sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))