Tensorflow的基本使用

使用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)]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 介绍 首先让我们来看看TensorFlow! 但是在我们开始之前,我们先来看看Python API中的Ten...
    JasonJe阅读 11,814评论 1 32
  • 基本使用 使用 TensorFlow, 你必须明白 TensorFlow: 使用图 (graph) 来...
    西方失败9527阅读 781评论 0 1
  • 人究竟是个什么生物, 莫名的优越感, 以为只听懂自己说的话就以为自己很厉害, 别自恋了, 不过, 是一个小丑, 活...
    qu溜达溜达阅读 86评论 0 0
  • mac上有自带的脚本工具,脚本编辑器。AppleScript 是 Mac OS X内置的一种功能强大的脚本语言。 ...
    Curry_J_X阅读 10,920评论 2 8
  • 我曾经是一个做事经常半途而废的人,感兴趣的事情很多,尝试的事情很多,但善始善终的事情却极少。后来我开始反思,持续的...
    蓝溪b_d阅读 720评论 1 3