TensorFlow 特性
- ** 高度的灵活性**:向上扩展(python)、向下扩展(C++)非常方便;
- 真正的可移植性:多种设备可用,Desktop、Server、mobile,cloud 都可运行;
- 连接研究与生产:研究成果可以快速地转换成产品;
- 自动求微分:tensorflow 会自动帮您计算导数微分;
- 性能最优化 : tensorflow 给予了线程、队列、异步操作等以最佳的支持,你可以自由地将 Tensorflow 图中的计算元素分配到不同的设备上,将手边硬件的计算潜能全部发挥出来。
基本用法
使用 Tensorflow 你需要知道 TensorFlow 是如何:
- 将计算表示为 ** graphs ** 的.
- 在 ** Sessions ** 的上下文中执行 graphs 的.
- 将数据表示为 Tensor 的.
- 使用 Variables 维持状态的.
- 用 feeds 给任意操作提供数据,用** fetch** 从任意操作中获得数据.
TensorFlow 是一个程序系统,你可以用它把计算表示成 graph。在 graph 中的节点被称为** ops** ("operation"的缩略),一个 op 可以接受零个获多个 Tensor,执行一些计算,并产生零个或者多个 Tensor。 在 Tensorflow 的术语中,一个 Tensor 是一个类型化的多维数组。例如,你可以表示一个 mini-batch 图像为 4-D 浮点数数组 [batch, height, width, channels]。
一张 Tensorflow 图是一个计算的描述。计算任何东西,必须在一个 Session 里启动一个 graph。一个 Session 会将 graph 放到设备上,比如 CPU 或者 GPU ,并提供方法去执行它们。这些方法会返回 ops 产生的 tensor,在 python 中为 numpy 中的 ndarray 对象,在 C 和 C++ 中为 tensorflow::Tensor 实例。
构建 graph
构造 TensorFlow 程序通常分为:构建阶段、装配阶段、执行阶段,执行阶段使用 Session 去执行 graph 里面的 ops,建议使用 Python 库来装配 graph 更为方便(python 提供了大量的帮助函数)。
TensorFlow 的 python 库有默认的 graph 可供 op构造器添加 nodes,且默认的 graph 对许多应用来说已经满足了。
import tensorflow as tf
# Create a Constant op that produces a 1x2 matrix. The op is
# added as a node to the default graph.
#
# The value returned by the constructor represents the output
# of the Constant op.
matrix1 = tf.constant([[3., 3.]])
# Create another Constant that produces a 2x1 matrix.
matrix2 = tf.constant([[2.],[2.]])
# Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs.
# The returned value, 'product', represents the result of the matrix
# multiplication.
product = tf.matmul(matrix1, matrix2)
在 session 中启动 graph
不带参数的话,Session 构造器会启动默认的 graph。
# Launch the default graph.
sess = tf.Session()
# To run the matmul op we call the session 'run()' method, passing 'product'
# which represents the output of the matmul op. This indicates to the call
# that we want to get the output of the matmul op back.
#
# All inputs needed by the op are run automatically by the session. They
# typically are run in parallel.
#
# The call 'run(product)' thus causes the execution of three ops in the
# graph: the two constants and matmul.
#
# The output of the matmul is returned in 'result' as a numpy `ndarray` object.
result = sess.run(product)
print(result)
# ==> [[ 12.]]
# Close the Session when we're done.
sess.close()
Session 应该被关闭从而释放资源。你也可以使用一个 “with”块 进入 Session,这样的话 Session 会在 with块 的结尾自动关闭。
with tf.Session() as sess:
result = sess.run([product])
print(result)
TensorFlow 的实现将 graph定义 转换为可执行的 ops 分发到可用的计算资源上,类如 CPU 或者 GPU显卡 上。通常情况下,你不需要明确指定 CPU 或者 GPU。如果你有显卡的话,TensorFlow 使用你的第一个GPU,执行近可能多的 op。
如果在你的机器上有不止一个 GPU,要使用除第一个以外的GPU 则必须明确地分配 op 给它。用 with...Device 语句指明哪些 CPU 或者 GPU 用于 operations。
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)
...
Devices are specified with strings. The currently supported devices are:
"/cpu:0": The CPU of your machine.
"/gpu:0": The GPU of your machine, if you have one.
"/gpu:1": The second GPU of your machine, etc.
分布式 Session 中启动 graph
创建一个 Tensorflow 集群,发布 Tensorflow 服务到集群中的每个机器上。当你实例化客户端的一个 Session 时,你将它传递到集群中某台机器的网络地址中。
with tf.Session("grpc://example.org:2222") as sess:
# Calls to sess.run(...) will be executed on the cluster.
···
```
这台机器成了 Session 的主机。主机会发布 graph 到集群(workers)中的其它机器上,就像在本地实现了分布 graph 到一个机器中的可用计算资源上一样方便。
你可以用 “with tf.device():” 语句直接指定 graph 特定部分的 workers。
with tf.device("/job:ps/task:0"):
weights = tf.Variable(...)
biases = tf.Variable(...)
```
交互使用
在 Python 的交互式环境中,类如 IPython 你可以使用InteractiveSession
Class,和 Tensor.eval()、Operation.run() 方法,这样避免了必须维护一个 Variable 来展开 Session。
# Enter an interactive TensorFlow Session.
import tensorflow as tf
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.subtract(x, a)
print(sub.eval())
# ==> [-2. -1.]
# Close the Session when we're done.
sess.close()
Tensor
Tensorflow 程序使用 tensor 数据结构来表示所有的数据——也就是说,graph 中 op 之间只有 tensor 被传递。你可以将 Tensor 想象为一个 n-D 数组或列表。一个 tensor 有一个静态类型,一个等级,一个形状。
Variable
变量来维持 graph 执行过程中的状态,下面的例子展示了一个计数器的变量。
# Create a Variable, that will be initialized to the scalar value 0.
state = tf.Variable(0, name="counter")
# Create an Op to add one to `state`.
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# Variables must be initialized by running an `init` Op after having
# launched the graph. We first have to add the `init` Op to the graph.
init_op = tf.global_variables_initializer()
# Launch the graph and run the ops.
with tf.Session() as sess:
# Run the 'init' op
sess.run(init_op)
# Print the initial value of 'state'
print(sess.run(state))
# Run the op that updates 'state' and print 'state'.
for _ in range(3):
sess.run(update)
print(sess.run(state))
# output:
# 0
# 1
# 2
# 3
所有的 op 直到 graph 启动之后运行 run() 才开始执行,之前都是构建装配 graph 的阶段。
Fetch
获得 op 的输出,在 Session 对象中用一个 run() 调用来执行 graph,你可以获得一个 node 的状态,也可以获得多个 tensor。
input1 = tf.constant([3.0])
input2 = tf.constant([2.0])
input3 = tf.constant([5.0])
intermed = tf.add(input2, input3)
mul = tf.multiply(input1, intermed)
with tf.Session() as sess:
result = sess.run([mul, intermed])
print(result)
# output:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
Feed
一般情况下,tensor 被存储在 Constants 和 Variables 中送入 graph。Tensorflow 也提供了一种直接将 tensor 送入 graph 中的任何 op 的 feed 机制。
feed 用一个 tensor 值暂时替代一个 op 的输出。你提供 feed 数据作为 run() 调用的一个参数,这个 feed 仅用于执行它被传递的函数的 run() 调用。通常使用 tf.placeholder() 来创建 feed。
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.muliply(input1, input2)
with tf.Session() as sess:
print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))
# [output]: [array([ 14.], dtype=float32)]
# output: [14.]
结论
目前,机器学习的相关库已经有很多了,关于每个库的好坏大家也都各执其词。作为一个号称 “智能科学与技术”专业的大三狗,为了满足时代需求,不负国家培育,我选择了 TensorFlow 。为什么呢?因为 Google 靠谱,因为 Tensorflow 简单,因为它支持 windows 啊,因为用起来顺手啊······当然,也有人抱怨它的缺点,什么“黑箱”啊、速度慢之类的。但喜欢它,就得包容它的缺点不是吗!
** END.**
by 逸尘白狼
网友评论