TensorFlow是Google开发的第二代人工智能系统,于2015年11月宣布开源。故名思义,TensorFlow的要素为张量(Tensor)和流(Flow),他们分别是系统的数据结构和算法框架。TensorFlow的设计想法就是通过让N维向量在数据流图(Data Flow Graph)上的一个节点流到另一个节点的方式来完成计算。
例如,我们现在要计算两个矩阵相乘。在TensorFlow的框架下,第一步的工作是建立数据流图。在这个例子中,我们仅需要三个节点(TensorFlow中节点用op表示,operation的缩写):两个常数ops和一个计算乘法并输出结果的op.两个常数ops将自己的内存地址传到计算op上,计算op接受来自常数ops的输入,最后完成计算。代码如下:
import tensorflow as tf
matrix1 = tf.constant([[1., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2, name="A")
到现在为止,这几行代码只是在创建Data Flow Graph的拓扑结构,并没有做任何实质性的运算。观察一下,matrix1,matrix2,product的类型均为Tensor,product被命名为A,默认初始化为0:
>>> type(matrix1)
>>> tensorflow.python.framework.ops.Tensor
>>> type(product)
>>> tensorflow.python.framework.ops.Tensor
>>> print(product)
>>> Tensor("A:0", shape=(1, 1), dtype=float32)
数据流图建好了,接下来我们可以启动计算。这通过新建一个Session对象来实现:
sess = tf.Session()
result = sess.run(product)
sess.close()
run(op)方法将执行op节点本地以及所有op所需的input的计算,返回类型是numpy.ndarray.最后用close( )方法来回收对象。我们可以看一看执行结果:
>>> print(result)
>>> [[ 8.]]
这也可以通过with语句来实现,以下代码执行完毕后将自动回收sess.其中run( )的参数可以是一个op的list, 返回结果则是numpy.ndarray的list.
with tf.Session() as sess:
result = sess.run([product, matrix1, matrix2])
在执行一个Session的动作时,无需人为指派,TensorFlow会自动调度单机上的CPU和GPU资源实现并行。当然,我们也可以人为分配计算资源到一个任务:
with tf.Session() as sess:
with tf.device("/gpu:1"):
matrix1 = tf.constant([[1., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
其中参数”/cpu:0”表示计算机的CPU,”/gpu:0”,”/gpu:1”,…表示计算机的第1,2,…个GPU…
每次调用run( )方法都要通过sess对象是很麻烦的,好在TensorFlow为我们提供了InteractiveSession对象。通过生成InteractiveSession对象,我们相当于创建了一个全局的session,此后可以直接对变量调用run( ).示例代码如下:
sess = tf.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])
# Initialize 'x' using the run() method of its initializer op.
x.initializer.run()
# Add an op to subtract 'a' from 'x'. Run it and print the result
sub = tf.sub(x, a)
print(sub.eval())
输出结果为
>>> [-2. -1.]