本博客是根据斯坦福大学的一门 tensorflow 课程的课件整理。这是课程地址 CS 20: Tensorflow for Deep Learning Research。
1 前言
什么是 TensorFlow?
“Open source software library for numerical computation using data flow graphs”
为什么用 TensorFlow?
- 有许多机器学习库;
- 具有灵活性和扩展性;
- 许多人已经在用了,现今很流行,许多闻名的大公司也在用 TensorFlow;
- ………..
上面这些都不重要,让我们进入正题。
2 Graphs and Sessions(图和会话)
什么是 张量(Tensor)?
所谓的 TensorFlow 中的 TensorFlow 是什么呢?这个问题其实比较复杂,我们这里就不细讲,就给出一个非常简单的概念:
0 维张量:标量(scalar)。也就是我们一般意义上的 数字(number)。
1 维张量:向量(vector)。
2 维张量:矩阵(matrix)。
-
TensorFlow separates definition of computations from their execution.
TensorFlow 将计算的定义和执行分开了。所以我们使用 TensorFlow 计算的步骤应该是:
- 定义一张 计算图(Graphs);
- 使用一个 会话(session) 去执行图中的操作。
假如你在终端输入下面两行代码:
import tensorflow as tf a = tf.add(3, 5)
上面两行代码定义的其实就是:
如果你学过神经网络,会发现这东西很眼熟。就像神经网络是由很多神经元组成的一样,TensorFlow 中的计算图也将由许多如上的结构组成。其中,
- 节点(Nodes):表示操作,变量或者常亮;
- 边(Edges):表示张量(tensors)。
现在我们试着将上面定义的东西打印出来看一下:
import tensorflow as tf a = tf.add(3, 5) print(a)
输出:
>> Tensor("Add:0", shape=(), dtype=int32)
没有输出我们期待的
8
,要怎么样能计算出a
的值呢?答案就是session
.我们来创建一个
session
试试:import tensorflow as tf a = tf.add(3, 5) sess = tf.Session() print(sess.run(a)) sess.close()
输出:
>> 8
有了
session
,我们就能计算出a
的值了 。但是以防我们忘记关闭
session
,所以官方推荐我们这么写:import tensorflow as tf a = tf.add(3, 5) with tf.Session() as sess: print(sess.run(a))
所以
session
的作用是什么呢?A Session object encapsulates the environment in which Operation objects are executed, and Tensor objects are evaluated.
Session will also allocate memory to store the current values of variables .
因为英语比较渣,所以一直翻译不通顺这两句话,大概意思就是
session
封装了一个环境,在这个环境里,就可以去执行图中各种操作了,同时session
还会去分配变量的内存。我们还可以定义更多节点的图:
x = 2 y = 3 op1 = tf.add(x, y) op2 = tf.multiply(x, y) op3 = tf.pow(op2, op1) with tf.Session() as sess: op3 = sess.run(op3)
上述代码定义了如下的图:
需要指出的一点是,TensorFlow 并不会自动的去计算图中所有节点的值,只有这个节点需要被计算出来的时候(比如其他节点的输出依赖此节点的输出。或者用户想要计算这个节点的值),TensorFlow 才会去计算,因为并不是每一次计算都需要所有节点的值。
3 分布式计算
tensorFlow 之所以强大,有一个原因是因为它可以将一张图分成多个部分并行计算,比如在你的 4 张
GTX 1080Ti
上并行计算。可以自行指定要在哪个
CPU
或者GPU
上执行:# Creates a graph. with tf.device('/gpu:2'): a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], name='a') b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], name='b') c = tf.multiply(a, b) # Creates a session with log_device_placement set to True. sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) # Runs the op. print(sess.run(c))
4 创建多张图
建议你不要这么做,因为
- 因为多张图意味着要多个
session
,而每个session
都会努力的抢占你计算机上的所有资源; - 不能在不通过
numpy
的情况下传递数据,不然就不能分布式计算了; - 可以通过分开一张图变成多张子图来满足你想要多张图的需求。
所以你应该不再想创建多张图了。
- 因为多张图意味着要多个
如果你还是坚持的话………….那你自己去找其他资料吧,里面有很多坑。
5 Why graphs?
- 节省计算。只去计算那些你想要求值的子图。
- 分解计算,以便可以实现自动微分。
- 促进分布式计算,将计算过程分布在
CPU
,GPU
,TPU
或者你想要的其他设备。 - 许多常见的机器学习模型都是可以看成有向图结构的。