tensorflow学习日志(一) MNIST入门

建立一个拥有一个线性层的softmax回归模型

参考文档:tensorflow中文社区http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html

一 导入tensorflow,MNIST数据集

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

注:在自动下载安装的时候可能会发生连接错误,下载失败!主目录生成"MNIST_data"文件夹,但里面没有文件
解决方法:手动下载
MNIST数据集的官网,下载:

train-images-idx3-ubyte: training set images
train-labels-idx1-ubyte: training set labels
t10k-images-idx3-ubyte:  test set images
t10k-labels-idx1-ubyte:  test set labels 

下载完的压缩包不要解压放在"MNIST_data"文件夹里,然后重新运行代码:

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

二 创建变量

softmax回归模型:
分析MNIST图像为得到代表每个数字的概率,为得到图像属于某特定数字类的证据,对图片像素值进行加权求和;w代表权重, b代表数字 i 类的偏置量,然后用softmax函数可以把这些证据转换成概率 y: y=softmax(Wx + b)

x=tf.placeholder("float",shape=[None,784])#用二维浮点数的张量表示MNIST图像,每张图为784维向量
w=tf.Variable(tf.zeros([784,10]))#w代表权重,维度是【784,10】
b=tf.Variables(tf.zeros([10]))#b代表偏置值,
y=tf.nn.softmax(tf.matmul(x,w)+b)#通过softmax函数得出概率值

tf.placeholder表示占位符,可以在TensorFlow运行某一计算时根据该占位符输入具体的值。虽然placeholder的shape参数是可选的,但有了它,TensorFlow能够自动捕捉因数据维度不一致导致的错误。
模型定义权重W和偏置b,可以将它们当作额外的输入量,在机器学习的应用过程中,模型参数一般用Variable来表示。

三 训练模型

添加新的占位符用于输入正确值:

y_=tf.placeholder("float",shape=[None,10])

计算交叉熵,其中y表示预测的概率分布,y_表示实际的分布。首先,用 tf.log 计算 y 的每个元素的对数。接下来,我们把 y_ 的每一个元素和 tf.log(y) 的对应元素相乘。最后,用 tf.reduce_sum 计算张量的所有元素的总和:

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

要求tensorflow使用梯度下降算法(gradient descent algorithm),一种简单的学习过程,我们用最速下降法让交叉熵下降,步长为0.01:

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

此时,模型已设置完成。

在运行前,添加一个变量来初始化我们创建的变量:

init=tf.initialize_all_variables()

Tensorflow依赖于一个高效的C++后端来进行计算。与后端的这个连接叫做session。一般而言,使用TensorFlow程序的流程是先创建一个图,然后在session中启动它。
这里,我们使用更加方便的InteractiveSession类。通过它,你可以更加灵活地构建你的代码。它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利,比如使用IPython。如果你没有使用InteractiveSession,那么你需要在启动session之前构建整个计算图,然后启动该计算图。
现在我们可以在一个InteractiveSession类里面启动我们的模型,并且初始化变量:

sess = tf.InteractiveSession()
sess.run(init)

每一步迭代,我们都会加载50个训练样本,然后执行一次train_step,并通过feed_dict将x 和 y_张量占位符用训练训练数据替代。
注意,在计算图中,你可以用feed_dict来替代任何张量,并不仅限于替换占位符。

for i in range(1000):
  batch = mnist.train.next_batch(50)
  train_step.run(feed_dict={x: batch[0], y_: batch[1]})

四 评估模型

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

corrrect_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}))

正确率约为91%

猜你喜欢

转载自blog.csdn.net/sazass/article/details/87087509