1. TensorFlow 2 实现图执行模式开发
TensorFlow 2 虽然和TensorFlow 1.X有较大差异,不能直接兼容TensorFlow 1.X代码。但实际上还是提供了对TensorFlow 1.X 的 API支持。原有的TensorFlow 1.X 的 API整理到tensorflow.compat.v1包里去了。因此TensorFlow 2 中执行或者开发TensorFlow 1.X代码,可以做如下处理:
1、导入TensorFlow时使用 import tensorflow.compat.v1 as tf 代替import tensorflow as tf;
2、执行tf.disable_eager_execution() 禁用TensorFlow 2默认的即时执行模式。
2. TensorFlow 1.x 图执行模式编程案例
这里以计算2个数相加的简单案例作为示例,通过 TensorFlow 1.X 的图执行模式API实现计算。
体验案例:计算两数之和
建立计算图
首先导入tensorflow.compat.v1,禁用即时执行模式:
# 在TensorFlow 2下执行TensorFlow 1.x版本代码
import tensorflow.compat.v1 as tf
tf.disable_eager_execution() # 改为图执行模式运行
以下三行代码定义了一个简单的计算图:
# 定义了一个简单的“计算图”
node1 = tf.constant(3.0,tf.float32,name="node1")
node2 = tf.constant(4.0,tf.float32,name="node2")
node3 = tf.add(node1, node2)
由于是图执行模式,这时仅仅是建立了计算图,但它并没有执行。执行以下语句:
node1,node2,node3
结果显示如下:
('node1:0' shape=() dtype=float32>,'node2:0' shape=() dtype=float32>, 'Add:0' shape=() dtype=float32>)
可以看到,无论是前面定义的2个常量还是add操作的结果都是张量,但在输出的张量结构中都没有具体的值。需要注意的是:在静态计算图执行编程模式时,张量这时并没有真正保存数值,它保存的只是计算过程。
此处张量属性的第一项就是名字(name),一般形式为“node:src_output”,node表示节点名称,src_output 来自节点的第几个输出。本例node3节点名称是“add”,因为在定义add操作时没有给name属性赋值,这个名称是系统根据操作节点自动命名的。
这个计算图可以通过TensorBoard可视化工具进行查看,图形如图2.1所示。有关TensorBoard的具体应用将在后面结合案例讲解。
图2.1 简单的计算图
执行计算图
定义好计算图后,需要建立一个会话(Session),使用会话对象来实现计算图的执行。
sess = tf.Session() # 建立对话并显示运行结果
print("运行sess.run(node1)的结果:", sess.run(node1))print("运行sess.run(node2)的结果:", sess.run(node2))print("运行sess.run(node3)的结果:", sess.run(node3))
sess.close() # 关闭session
以上代码运行的结果如下:
运行sess.run(node1)的结果: 3.0
运行sess.run(node2)的结果: 4.0
运行sess.run(node3)的结果: 7.0
通过以上示例可以看出,在TensorFlow 1.X图执行模式中,不像在TensorFlow 2即时执行模式下能直接返回张量的值,而是首先要创建一个静态的计算图模型,然后再建立会话,在会话中执行操作后才将能得到张量的值。
阅读原文?直接进入课程!