TensorFlow 的设计理念主要体现在以下两个方面。
(1)将图的定义和图的运行完全分开
我们知道,编程模式通常分为命令式编程(imperative style programming)和符号式编程(symbolic style programming)。命令式编程就是编写我们理解的通常意义上的程序,很容易理解和调试,按照原有逻辑执行。符号式编程涉及很多的嵌入和优化,不容易理解和调试,但运行速度相对有所提升。现有的深度学习框架中, Torch 是典型的命令式的, Caffe、 MXNet 采用了两种编程模式混合的方法,而 TensorFlow 完全采用符号式编程。符号式计算一般是先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系,最后需要对数据流图进行编译,但此时的数据流图还是一个空壳儿,里面没有任何实际数据,只有把需要运算的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。
例如:
t = 8 + 7
print("t:", t)
输出的结果就是:
t: 15
而在 TensorFlow中,数据流图中的节点,实际上对应的是 TensorFlow API 中的一个操作,并没有真正去运行,如下:
import tensorflow as tf
t = tf.add(8, 9)
print(t)
输出的结果却是:
Tensor("Add:0", shape=(), dtype=int32)
这是因为上述代码只是定义了一个操作,实际上并没有运行.
(2) TensorFlow 中涉及的运算都要放在图中
TensorFlow 中涉及的运算都要放在图中,而图的运行只发生在会话(session)中。开启会话后,就可以用数据去填充节点,进行运算;关闭会话后,就不能进行计算了。因此,会话提供了操作运行和 Tensor 求值的环境。
import tensorflow as tf
# 创建图
a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])
c = a * b
# 创建会话
sess = tf.Session()
# 计算 c
print(sess.run(c))
# 关闭会话
sess.close()
结果:
[3. 8.]
ps:全部摘自李嘉璇的<<TensorFlow 技术解析与实战>>第四章4.2节