使用tensorflow 你必须明白tensorflow
- 使用图(graph)来表示计算任务
- 在被称为会话 Session 的上下文context 中执行图
- 使用tensor来表示数据,放在图的节点中
- 通过变量(Variable)来维护状态
- 使用feed和fetch 可以为任意的操作(arbitrary operation)赋值或者从其中获取数据
这个图,其实就是计算图,具体原理不需要知道,计算图就是flow ,也可以认为是工作流图,op(节点)的执行步骤 就被描述成一个图 ,tensor之间的转换就是op处的计算来做的
计算图 Tensorflow
一个TensorFlow图描述来计算的过程,为了进行计算,图必须在会话 session里被启动,会话将op分发到CPU GPU这样的设备上,同时执行op的方法,这些方法被执行后,将产生的tensor返回,在Python中 返回的 是 numpy ndarray对象
TensorFlow程序经常被组织成一个构建阶段和一个执行阶段,在构建阶段,op的执行步骤被描述成一个图,在执行阶段,使用会话执行执行图中的op,因此会话开启执行的环境
因此 我们通常在构建阶段,创一个神经网络,然后在执行阶段通过session反复调用这个神经网络,执行图中的op
构建图
构建图的第一步,是创建源op,源op不需要任何的输入,例如常量constant 源op的输出被传递给其他op做运算
matrix1=tf.constant([[3.,3.]]) 1x2矩阵
matrix2=tf.constant([[2.] , [2.]]) 2x1矩阵
product=tf.matmul(matrix1,matrix2)
启动图
sess = tf.session()
result=sess.run(product) 执行上面定义的三个运算
print result 打印获取的矩阵
任务完成 关闭会话:
sess.close()
With 代码块
with tf.Session() as sess:
result = sess.run([product])
print result
With代码块,自动获取和释放资源,除了显式调用close外,也可以使用with代码块来自动完成关闭释放资源动作
变量 Variables
# 创建一个变量, 初始化为标量 0.
state = tf.Variable(0, name="counter")
#疑问一:这个name 有什么用?
# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# 注意这里的add 和 给
# 而且无论怎样 都需要定义 操作op 然后 才可以跑 任何方法 都是有返# 回值的
# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 首先必须增加一个`初始化` op 到图中.
init_op = tf.initialize_all_variables()
# 包含变量的情况 必须在session会话中 先执行此操作
# 启动图, 运行 op
with tf.Session() as sess:
# 运行 'init' op
sess.run(init_op)
# 打印 'state' 的初始值
print sess.run(state)
# 运行 op, 更新 'state', 并打印 'state'
for _ in range(3):
sess.run(update)
print sess.run(state)
#疑问2 直接print state 不行吗? 为什还要sess.run一下
绘制操作图,然后一步步 用session 执行 或许 只跑最终定义的一个op就行
Fetch 和 Feed
with tf.Session() as sess:
result = sess.run([mul, intermed])
print result
# 取回多个值
feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.
#也就是说 feed 和 placeholder 结合使用 否则placeholder 定义的随时#被替换的 tensor就没有意义 始终没有输入值的话
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 输出:
# [array([ 14.], dtype=float32)]