程序结构
tensorflow程序一般分为两个阶段:
- 阶段1:定义计算图所有的计算。
- 阶段2:在session中执行计算。
阶段1
计算图(Computational Graph)
在理解计算图之前,先理解张量(Tensor)和流(Flow):
- Tensor:在TensorFlow的范畴内,可以简单理解成多维数组。详细理解: https://www.cnblogs.com/abella/p/10142935.html
- Flow:中文翻译是“流”,形象地表达了张量之间通过计算相互转化的过程。
计算图:是包含节点和边的网络,需要定义所有要使用的数据,也就是张量(tensor)对象(常量、变量和占位符),同时定义要执行的所有计算,即运算操作对象(Operation Object,简称OP)。
每个节点可以有零个或多个输入,但只有一个输出。
阶段2
计算图的执行:使用会话对象来实现计算图的执行。会话对象封装了评估张量和操作对象的环境。这里真正实现了运算操作并将信息从网络的一层传递到另外一层。不同张量对象的值仅在会话对象中被初始化、访问和保存。在此之前张量对象只被抽象定义,在会话中才被赋予实际的意义。
实例:
1.定义两个向量v_1和v_2作为输入提供给Add操作,建立计算图如下:
2.相应代码:
import tensorflow as tf
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)
3.然后在会话中执行计算图:
with tf.Session() as sess:
print(sess.run(v_add))
4.运行结果是显示两个向量的和:
[3 3 8 7]
完整代码:
import tensorflow as tf
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)
with tf.Session() as sess:
print(sess.run(v_add))
#会话部分可以不用with
import tensorflow as tf
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)
sess = tf.Session()
print(sess.run(v_add))
sess.close()
解读分析:
-
该例子中计算图有三个节点组成,v_1和v_2是输入;
-
为了使图生效,首先需要使用tf.Session()定义一个会话对象sess.然后使用Session类中定义的run方法运行它.
run(fetches,feed_dict = None,options = None,run_metada)
-
运行的结果在fetches中提取,提取的张量是v_add。而且一次可以提取一个或多个张量或操作对象,例如,结果抽取的是[v_1,…v_add]
import tensorflow as tf v_1 = tf.constant([1,2,3,4]) v_2 = tf.constant([2,1,5,3]) v_add = tf.add(v_1,v_2) with tf.Session() as sess: print(sess.run([v_1,v_2,v_add]))
[array([1, 2, 3, 4]), array([2, 1, 5, 3]), array([3, 3, 8, 7])]
-
在同一段代码中,可以有多个会话对象。
-
每个会话都需要使用close()来明确关闭,而with格式可以在运行结束后隐式关闭会话。
扩展
本人是用Jupyter Notebook进行编程的,使用tf.InteractiveSession比tf.Session更方便。因为InteractiveSession使自己成为默认会话,因此可以使用eval()直接调用运行张量对象而不用显式调用会话.
import tensorflow as tf
sess = tf.InteractiveSession()
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([2,1,5,3])
v_add = tf.add(v_1,v_2)
print(v_add.eval())
sess.close()
[3 3 8 7]
参考:
- TensorFlow教程: http://c.biancheng.net/tensorflow/
- TensorFlow计算模型-计算图: https://www.jianshu.com/p/b5a383d54645