MNIST数据集开始一个tensorflow的训练
Tensorflow的计算依赖于一个高效的C++backend,和backend的连接叫做一个session。tensorflow常常是先建立一个graph再在一个session里面运行。
这里用IteractiveSession类,这个类可以更加灵活的建立计算图。你也可以不同Interactive Session,那就在开始一个session之前建立整个计算图并运行图。
import tensorflow as tf
sess = tf.InteractiveSession()
Tensorflow核心的程序可以被分成两个部分,建立计算图,运行计算图。一个计算图是一组Tensorflow的操作。计算图中的每一个节点取0或者更多的张量(Tensor)作为输入,并且产生一个张量作为输出。一种节点类型是常量,不取任何输入,并且产生一个值内部存储。我们可以产生浮点张量node1和node2如下:
node1 = tf.constant(3.0, dtype = tf.float32)
node2 = tf.constant(4.0)
print(node1, node2)
产生的输出:
<tf.Tensor 'Const:0' shape=() dtype=float32>, <tf.Tensor 'Const_1:0' shape=() dtype=float32
你会发现,并没有如你期望的输出3.0和4.0。为了真的得到这些节点的值,我们要在一个session中运行一个计算图。这个session封装了Tensorflow运行时间的控制和运行状态。
下面的代码产生了一个session对象,run方法运行了足够的计算图去得到node1和node2的值。
sess = tf.Session()
print(sess.run([node1, node2]))
输出:
[3.0, 4.0]
a=tf.placeholder(tf.float32)
b=tf.placeholder(tf.float32)
adder_node = a+b
给a,b赋值:
print sess.run(adder_node, {a:3,b:4.5})
print sess.run(adder_node, {a:[1,2],b:[3,4]})
输出:
7.5
[4,6]
再定义一个操作:
add_triple = adder_node*3
print sess.run(add_triple, {a:3,b:4.5})
输出:22.5
但是在机器学习中我们希望有一个model取任意的输入,Variable允许我们在graph中加入任意类型的参数。
比如你可以用下面的初值和类型建立一个图:
W=tf.Variable([.3],dtype = tf.float32)
b = tf.Variable([-.3], dtype = tf.float32)
x=tf.placeholder(tf.float32)
linear_model = W*x+b
Variable和cosntant不同,不会一开始就被初始化,要初始化Tensorflow程序中的所有的变量,必须要:
init = tf.global_variables_initializer()
sess.run(init)
现在就可以得到x取不同的值时linear model的值:
print(sess.run(linear_model,x:{1,2,3,4}))
现在已经构造了一个模型,但是我们不知道这个模型有多好。为了在训练数据上进行验证,我们需要一个y placeholder提供一个理想的值,并且需要构造一个loss function。
loss function衡量现在的模型距离提供的数据有多远。我们用一个标准的loss model来进行线性回归,就是对现存模型和提供的数据的差平方进行求和。linear_model-y产生了一个向量,每一个元素都是相关的样本的错误。
y=tf.placeholder(tf.float32)
squared = tf.square(linear_model-y)
loss = tf.reduce_sum(squared_deltas)
print(sess.sun(loss,{x:[1,2,3,4], y:[0,-1,-2,-3]}))
如果我们想改变x和W的值,需要调用函数assign()。
fixW = tf.assign(W,[-1.])
fixb = tf.assign(b,[1.])
sess.run([fixW,fixb])
print sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]})
得到的输出是:0.0
在下面的这一个小节,我们将讲述怎么训练得到最佳的loss。
最简单的优化器是梯度下降。它根据loss对每一个variable的导数改变每一个variable。tensorflow可以自动的实现这个求导。