tensorflow 学习

基本概念

  1. 使用图(graph)来表示计算任务
  2. 在会话(session)中执行图
  3. 使用(tensor)来表示数据结构
  4. 使用(variable)来维护状态
  5. 使用feed与fetch为任意的操作赋值或者获取数据

就是说,任何的运算要用图来进行计算,图要放在一个更大的环境中执行,也就是session。在tensorflow中,基本的数据结构是tensor,获取数据与添加数据使用feed和fetch。

构建一个tensorflow模型的基本步骤

一般流程是先创建一个图(graph),然后在会话中启动它(session)。

更加方便的一种是Interactivesession类,使用他,可以更加方便的 构建你的代码,他能在让你运行图的时候插入一些图。

如果没有interactivesession类,你需要在启动session之前构建整个计算图,然后启动这个计算图。

import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

import tensorflow as tf
sess = tf.InteractiveSession()

构建softmax回归模型

占位符

通过为输入与输出设置节点,开始构建图:

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

这里的x,y都不是特定的值,而是一个占位符,在tensorflow运行对的时时候根据这个占位符输入具体的值。
输入图片x表示 表示一个二位的浮点数张量,这里分配给他的shape=[None,784],784表示一张展平的图片维度,None表示其值的大小不一定。虽然palceholder的shape是可选的,但是有了它,tensorflow可以捕捉应为数据维度不一样而导致的错误。

变量

在机器学习的过程中,参数一般使用变量来表示。

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

我们在调用tf.variable的时候传入参数,在这个例子里面,把
w和b都赋值为0,其中w是一个784乘以10的矩阵,b是一个一维向量。
变量需要通过session初始化后,才能够在session中使用

sess.run(tf.initialize_all_variables())

类别预测与损失函数

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

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

损失函数就是目标类别与预测类别之间的交叉熵。

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

tf.reduce_sum把minibatch里的每张图片的交叉熵值都加起来了。我们计算的交叉熵是指整个minibatch的。

训练模型

我们已经定义好模型与损失函数,用tensorflow进行训练就很简单了:

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

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

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组成,因此最大值1所在的索引位置就是类别标签,比如tf.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,而 tf.argmax(y_,1) 代表正确的标签,我们可以用 tf.equal 来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)。

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"))

最后,我们可以计算出在测试数据上的准确率,大概是91%。

print accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})
    原文作者:Liam_ml
    原文地址: https://www.jianshu.com/p/7c69db6cd3de
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞