TensorFlow
TensorFlow是一个用于机器学习的开源软件库,它是google的第二代机器学习系统。机器学习作为当前最火的学习领域之一,来自google的TensorFlow,从发布以来获得了极大地关注。
TensorFlow采用所谓的数据流图(data flow graphs),用于数值计算。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。目前主要用于机器学习和深度神经网络方面的研究,但这个系统由于有很强的通用性所以也可以应用于其他计算领域。

安装
以Ubuntu为例,TensorFlow的安装很简单:
如果之前没有安装pip的话最好装一个。
1
| $ apt-get install python-pip
|
另外可能需要安装python-dev。
1
| $ apt-get install python-dev
|
然后来安装TensorFlow,CPU和GPU支持的版本安装如下:
1 2 3 4 5
| # 仅使用 CPU 的版本 $ pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl # 开启 GPU 支持的版本 (安装该版本的前提是已经安装了 CUDA sdk) $ pip install https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
|
你也可以安装在docker中,这样你就不用担心各种依赖,默认的最小安装如下:
1
| $ docker run -it b.gcr.io/tensorflow/tensorflow
|
你也可以选择完全安装:
1
| $ docker run -it b.gcr.io/tensorflow/tensorflow-full
|
如何开始
TensorFlow的Python API依赖Python 2.7,TensorFlow支持C,C++,Python这几种语言,目前Python库更加易用,因为它提供了大量的辅助函数来简化构建图的工作,这些函数C和C++还不支持,所以我们以Python语言为例吧。
试着运行TensorFlow:
打开一个python终端,然后输入:
1 2 3 4 5 6 7 8 9 10 11
| $ python >>> import tensorflow as tf >>> hello = tf.constant('Hello, TensorFlow!') >>> hubwiz = tf.Session() >>> print hubwiz.run(hello) Hello, TensorFlow! >>> a = tf.constant(62) >>> b = tf.constant(62) >>> print hubwiz.run(a*b) 3844 >>>
|
好像也挺简单,对吧。
基本用法
使用TensorFlow 需要明白几个术语:
- 图(graph),用来表示计算任务的。
- 会话(Session),在Session中执行图。
- 数据(tensor),数据传递。
- 变量(Variable),用来维护状态。
- feed和fetch机制,负责赋值和获取数据。
- 节点(op),操作。
使用TensorFlow进行编程的时候,用图来表示计算任务。一个TensorFlow图就描述了一个计算过程,为了进行计算,图必须在Session中启动。Session会将图的各种操作分发到设备上,然后通过提供执行的方法。执行后,会将这些方法产生的结果数据也就是tensor返回来,这样就完成了一个计算过程。
如果没有理解可以再看一下“如何开始”中的示例,就会容易理解一些。
构建图是最初第一步, 接着是创建source op,可以不需要任何输入, 如直接使用常量 (Constant),如同我们上面的简单示例。source op的输出能够被传递给其它的op做运算.
Python库中, op构造器的返回值就是被构造出来op的输出, 这些返回值可以作为其它op构造器的输入进行传递。
TensorFlow的Python库里有一个默认图 (default graph),我们上面的示例中用过,这个默认图对我们初学者来说很多时候够用了。下面我们来看一个构造代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| import tensorflow as tf # 创建一个常量op,产生一个1x2的矩阵。 这个op被作为一个节点加到默认图中。 # # 构造器的返回值就表示这个常量op的返回值. matrix1 = tf.constant([[3., 3.]]) # 创建另外一个常量op, 产生一个2x1的矩阵。 matrix2 = tf.constant([[2.],[2.]]) # 创建一个矩阵乘法matmul op,把 'matrix1'和'matrix2'作为输入。 # 'product'是矩阵乘法结果的返回值。 product = tf.matmul(matrix1, matrix2)
|
构造好了就可以在Session启动了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # 启动默认图. hubwiz = tf.Session() # 调用hubwiz的 'run()' 方法来执行矩阵乘法 op, 将'product'作为该方法的输入参数。 # 'product'是矩阵乘法op的输出, 传入它说明我们需要得到矩阵乘法op的输出。 # # 会话负责传递op所需的全部输入。 # # 函数调用了'run(product)'并触发了图中三个op(两个常量op和一个矩阵乘法op)的执行。 # # 返回值'result'是一个numpy的`ndarray`对象。 result = hubwiz.run(product) print result # ==> [[ 12.]] # 任务完成, 需要关闭会话. hubwiz.close()
|
代码也可以用with语句来完成,Session(会话)会自动关闭:
1 2 3
| with tf.Session() as hubwiz: result = hubwiz.run([product]) print result
|
为了使用类似IPython的Python交互环境, 可以使用InteractiveSession来代替Session, 使用Tensor.eval()和Operation.run()代替Session.run()。这样可以避免一个变量就占用了整个会话。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 进入一个交互式 TensorFlow 会话. import tensorflow as tf hubwiz = tf.InteractiveSession() x = tf.Variable([11.0, 2.0]) a = tf.constant([3.0, 13.0]) # 通过初始化构造器initializer的方法run()来初始化'x'。 x.initializer.run() # 增加一个减法sub, 从'x'减去'a'。 sub = tf.sub(x, a) print sub.eval() # ==> [-8. -11.]
|
为了取回操作的输出内容, 可以在用Session(会话)的run()方法调用图时, 传入一些 tensor, 这些tensor会可以返回你需要的结果。之前的例子里, 我们都是获取了单个节点的state, 你也可以获得多个tensor,这个就是Fetch机制,例如:
1 2 3 4 5 6 7 8 9 10 11 12
| input1 = tf.constant(3.0) input2 = tf.constant(6.0) input3 = tf.constant(5.0) intermed = tf.add(input2, input3) mul = tf.mul(input1, intermed) with tf.Session() as hubwiz: result = hubwiz.run([mul, intermed]) print result # 输出: # [array([ 33.], dtype=float32), array([ 11.], dtype=float32)]
|
Fetch机制是一次获取多个tensor。
另外还有一个Feed机制,它可以让你临时替代图中的任意操作中的tensor实际上是提交了一个补丁,直接插入一个tensor。例如:
1 2 3 4 5 6 7 8 9
| input1 = tf.placeholder(tf.types.float32) input2 = tf.placeholder(tf.types.float32) output = tf.mul(input1, input2) with tf.Session() as hubwiz: print hubwiz.run([output], feed_dict={input1:[17.], input2:[2.]}) # 输出: # [array([ 19.], dtype=float32)]
|
基本的用法就到这里,更详细的内容需要自己去更深入的学习,这篇就先到这里,感兴趣的可以看看我们的视频TensorFlow入门5分钟。