简述
TensorFlow的基本思想就是使用图(graph)来表示计算任务。在会话(session)的上下文(content)中执行图。TensorFlow程序通常被组织成一个构建阶段和一个执行阶段,在构建阶段,op的执行步骤被描述成一个图。在执行阶段,使用会话执行图中的操作(operation简称op)。例如:通常在构建阶段创建一个图来表示和训练神经网络,然后再执行阶段反复执行图中的训练op。
构建图
首先举一个简单的构建图的例子,使用tensorflow默认图,向其中加入简单的op
import tensorflow as tf
# 创建两个常量op,分别产生一个1 * 2 和 2 * 1矩阵。
# 这个op被作为一个节点加入到默认图中
# 构造器的返回值代表该常量op的返回值
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.], [2.]])
# 创建一个矩阵乘法 matmul op, 把 matrix1和matrix2作为输入
# 返回product代表矩阵乘法的结果
product = tf.matmul(matrix1, matrix2)
经过上面的代码我们就成功构建了一个拥有三个op的图,为了要计算矩阵乘法我们还必须通过session启动这个图
# 启动默认图
sess = tf.Session()
result = sess.run(product)
print(result)
sess.close()
# 运行结束得到答案之后需要执行close()函数关闭session,以便资源回收。
# 也可以用with隐式关闭
with tf.Session() as sess:
result = sess.run(product)
print(result)
TensorFlow将图形定义转换成分布式执行的操作,以充分利用可用的计算资源(CPU或GPU)。一般情况你不需要显示指定使用CPU还是GPU,TensorFlow会自动检测。但是如果机器上有多块GPU,默认只尽可能使用第一块GPU,其它的不参与计算,需要手动指定GPU。
with tf.Session() as sess:
with tf.device("/gpu:1"):
result = sess.run(product)
print(result)
目前支持的设备包括:
- “/cpu:0”:机器CPU;
- “/gpu:0”:机器的第一个GPU,如果有的话
- “/gpu:1”:机器的第二个GPU,以此类推
在TensorFlow中图的概念非常重要,我们的神经网络都是用图来构建和训练的。
交互式使用
为了便于IPython之类的Python交互环境,可以使用InteractiveSession
代替Session
类,使用Tensor.eval()
和Operation.run()
方法代替Session.run()
。这样可以避免使用一个变量来持有会话。
# 进入一个交互式TensorFlow会话
import tenserflow as tf
sess = tf.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])
# 使用初始化器 initializer op的 run()方法初始化 ‘x’
x.initializer.run()
# 增加一个减法sub op,从'x'减去 'a'。运行减法op,输出结果
sub = tf.sub(x, a)
print(sub.eval()) # ==> [-2., -1.]
TensorFlow的数据结构
在TensorFlow中使用的数据结构是tensor,计算图中,操作间传递的数据都是tensor。相当于一个n维的数组。