1. 计算图是TensorFlow中最基本的一个概念,TensorFlow中所有计算都会被转化为计算图上的节点。TensorFlow的名字已经说明了它最重要的两个概念-Tensor和Flow。Tensor就是张量。在TensorFlow中,可以解释为多维数组。如果说TensorFlow的第一个词说明了它的数据结构,那么Flow说明了它的计算模型。Flow中文翻译为流,直观的表达了张量之间通过计算相互转化的过程。TensorFlow中的每一个计算都是图上的一个节点,而节点之间的边描述了计算之间的依赖关系。如果一个运算的输入依赖于另一个运算的输出,那么这两个运算就有依赖关系。
2. TensorFlow程序一般有两个过程,第一阶段需要定义计算图中所有的计算,第二个阶段为执行计算。构建图的第一步, 是创建源op(source op)。源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算.
第一步:构造图
TensorFlow有一个默认图,op构造器可以为其增加节点。
创建一个矩阵乘法 'matmul ' op , 把 'matrix1' 和 'matrix2' 作为输入. 返回值 'product' 代表矩阵乘法的结果.
>>> import tensorflow as tf
>>> matrix1=tf.constant([[3.,3.]]) #创建一个常量op
>>> matrix2=tf.constant([[2.],[2.]])#创建一个常量op
>>> product=tf.matmul(matrix1,matrix2)# 创建一个矩阵乘法matmul op ,把'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
第二步:执行计算
默认图现在有三个节点, 两个 constant() op, 和一个matmul() op. 为了真正进行矩阵相乘运算, 并得到矩阵乘法的结果, 你必须在会话里启动这个图.
构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图.
启动默认参数 ‘sess=tf.Session()’
调用sess的run()方法来执行矩阵乘法op,'product'代表了矩阵乘法op的输出,传入它是向方法表明,我们希望取回矩阵乘法op的输出。整个执行过程是自动化的,会话负责传递op所需的全部输入. op通常是并发执行的.函数调用 'run(product)' 触发了图中三个 op (两个常量op和一个矩阵乘法 op)的执行.返回值 'result'是一个 numpy `ndarray`对象.
任务完成, 关闭会话.
>>> sess=tf.Session()
>>> result=sess.run(product)
>>> print result
[[ 12.]]
>>> sess.close()
Session对象在使用完后需要关闭以释放资源. 除了显式调用 close 外, 也可以使用 "with" 代码块 来自动完成关闭动作.
>>> with tf.Session() as sess:
... result=sess.run(product)
... print result
...
[[ 12.]]
如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with...Device 语句用来指派特定的 CPU 或 GPU 执行操作:
with tf.Session() as sess:
with tf.device("/gpu:1"):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
...
设备用字符串进行标识. 目前支持的设备包括:
• "/cpu:0": 机器的 CPU.
• "/gpu:0": 机器的第一个 GPU, 如果有的话.
• "/gpu:1": 机器的第二个 GPU, 以此类推.
3. TensorFlow四则运算
加法
x =tf.add(5, 2) # 7
减法
x = tf.subtract(10, 4) # 6
乘法
y = tf.multiply(2, 5) # 10
除法
y = tf.div(10,5) # 2
类型转换
当你尝试计算两个不同类型的值的时候会出现报错,例如:
tf.subtract(tf.constant(2.0),tf.constant(1))
"""
ValueError: Tensor conversion requesteddtype float32
for Tensor with dtype int32:
"""
此时就需要使用tf.cast()转换类型:
tf.subtract(tf.cast(tf.constant(2.0),tf.int32), tf.constant(1)) # 1
>>> sess=tf.Session()
>>> print(sess.run(y))#display
4. 在TebsorFlow中系统会自动维护一个默认的计算图,通过tf.get_default_graph()函数可以获取当前默认的计算图。
以下代码示意了如何获取默认计算图以及查看一个运算所属的计算图。
>>> print(a.graph is tf.get_default_graph())
True
5. 交互式使用
文档中的 Python 示例使用一个会话 Session 来 启动图, 并调用 Session.run() 方法执行操作.
为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用InteractiveSession 代替 Session 类, 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run(). 这样可以避免使用一个变量来持有会话.
# 进入一个交互式 TensorFlow 会话.
import tensorflow as tf
sess = tf.InteractiveSession()
x =tf.Variable([1.0, 2.0])
a =tf.constant([3.0, 3.0])
# 使用初始化器initializerop 的 run() 方法初始化 'x'
x.initializer.run()
# 增加一个减法 sub op, 从 'x' 减去 'a'. 运行减法 op, 输出结果
sub = tf.subtract(x, a)
print sub.eval()
#==> [-2. -1.]