只是用作学习并为一些跟我一样的小白提供一些我学习的觉得重点的东西,类似笔记,主要学习来源:TensorFlow中文社区
一.TensorFlow的特点
- 使用图 (graph) 来表示计算任务.
- 在被称之为
会话 (Session)
的上下文 (context) 中执行图. - 使用 tensor 表示数据,每个 Tensor 是一个类型化的多维数组.(tensor张量看知乎上说是一个量在不同参考系下按照某种特定的法则进行转换,详细可参考https://www.zhihu.com/question/20695804)
- 通过
变量 (Variable)
维护状态. - 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
Tensor Flow用图来计算任务,其中图中每个节点用op表示,一个节点可以获取多个tensor并生成多个tensor,就是一个数据流图,描述了数据从输入到输出的变换过程。
三.详细过程
1.构建图
构建图的第一步, 是创建源 op (source op). 源 op 不需要任何输入例如 常量 (Constant)
。源 op 的输出被传递给其它 op 做运算.TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点.
import tensorflow as tf
# 创建一个常量 op, 产生一个 1x2 矩阵.(这点不太懂为什么是1*2) 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
为了真正进行矩阵相乘运算, 并得到矩阵乘法的 结果, 你必须在会话里启动这个图.
2.启动图
构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session
对象, 如果无任何创建参数, 会话构造器将启动默认图.
# 启动默认图.
sess = tf.Session()
# 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数.
# 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回矩阵乘法 op 的输出.
#
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
#
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
#
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print result
# ==> [[ 12.]]
# 任务完成, 关闭会话.
sess.close()
Session 对象在使用完后需要关闭以释放资源. 除了显式调用 close 外, 也可以使用 "with" 代码块 来自动完成关闭动作.
with tf.Session() as sess:
result = sess.run([product])
print result
注:1.
tf.Session.run(fetches, feed_dict=None)
运行操作并评估其中的张量fetches
。此方法运行一个TensorFlow计算的“步骤”,通过运行以执行每个所需的图形片段Operation
和评估每个Tensor
中fetches
,在代入值 feed_dict
对于相应的输入值。
所述fetches
参数可以是图形元件或单个图形元素的列表,且这些决定了该方法的返回值。图形元素可以是以下类型之一:
- 如果我的第一个元素
fetches
是一个Operation
,我的返回值将是None
。 - 如果我的第一个元素
fetches
是aTensor
,那么我返回的值将是包含该张量的值的numpy ndarray。 - 如果第i个元素
fetches
是aSparseTensor
,那么我返回的值将是包含SparseTensorValue
该稀疏张量的值。
可选feed_dict(A dictionary that maps graph elements to values (described above).)
参数允许调用者覆盖图中张量的值。每个键feed_dict
可以是以下类型之一:
- 如果键为a
Tensor
,则该值可能是可以转换为与dtype
该张量相同的Python标量,字符串,列表或numpy ndarray 。另外,如果密钥是 占位符,则将检查该值的形状是否与占位符兼容。 - 如果键为a
SparseTensor
,则该值应为aSparseTensorValue
。
close()
会话中的方法,也可以使用会话作为上下文管理器。以下两个例子是等效的:
# Using the `close()` method.
sess = tf.Session()
sess.run(...)
sess.close()
# Using the context manager.
with tf.Session() as sess:
sess.run(...)
用一个例子表现该类的
# 创建一个变量, 初始化为标量 0,可选名是“counter”.
state = tf.Variable(0, name="counter")
# 创建一个 op, 其作用是使 state 增加 1
#定义一个常量one=1
#state加one返回值给new_value(相当于中间值)
#assign()
操作是图所描绘的表达式的一部分(不太明白这点),和add()一样,所以在调用run()执行表达式和add()之前, 它并不会真正执行赋值操作.
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# 当启动图形时,必须显式地初始化变量,然后才能运行使用其值的操作。
# 最常见的初始化模式是使用便利函数initialize_all_variables(),将一个节点Op定义为该动作,并把该节点添加到初始化所有变量的图形中。然后在启动图表后运行该Op。
init_op = tf.initialize_all_variables()
# 启动图, 运行 op
with tf.Session() as sess:
sess.run(init_op)
# 打印 'state' 的初始值
print sess.run(state)
# 循环更新 'state', 并打印 'state'
for _ in range(3):
sess.run(update)
print sess.run(state)
# 输出:
# 0
# 1
# 2
# 3
五.返回数
为了取回操作的输出内容, 可以在使用 Session
对象的 run()
调用 执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果. 可取单个节点 state
, 也可以取回多个 tensor:
六 feed
该机制 可以临时替代图中的任意操作中的 tensor ,直接插入一个 tensor.你可以提供 feed 数据作为 run()
调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.