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 | import tensorflow as tf |
构造好了就可以在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
3with 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
12input1 = 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
9input1 = 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分钟。