Tensorflow学习记录(一)

MNIST数据集开始一个tensorflow的训练

Tensorflow的计算依赖于一个高效的C++backend,和backend的连接叫做一个session。tensorflow常常是先建立一个graph再在一个session里面运行。

这里用IteractiveSession类,这个类可以更加灵活的建立计算图。你也可以不同Interactive Session,那就在开始一个session之前建立整个计算图并运行图。

import tensorflow as tf
sess = tf.InteractiveSession()


计算图(Computation Graph)

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]

这种的计算图看起来并不是很有趣,一个图应该可以被参数化成可以接收外部的输入,这种graph叫做placeholder。

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可以自动的实现这个求导。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值