TensorFlow2.x与1.x区别

TensorFlow 2 是一个与 TensorFlow 1.x 使用体验完全不同的框架,TensorFlow 2 不兼容 TensorFlow 1.x 的代码,同时在编程风格、函数接口设计等方面也大相径庭。

提示:在《TensorFlow下载和安装详解(两种常用方式)》一节,我们介绍了 TensorFlow 的两种下载方式。

TensorFlow 1.x 的代码需要依赖人工的方式迁移,自动化迁移方式并不靠谱。重要的是 Google 即将停止支持 TensorFlow 1.x,因此并不建议学习 TensorFlow 1.x 版本,大家可以直接学习 TensorFlow 2.x 版本,对于 1.x 版本只需简了解即可。

TensorFlow 2 支持动态图优先模式,在计算时可以同时获得计算图与数值结果,能够在代码中实时调试打印数据,同时搭建网络也像搭积木一样,层层堆叠,非常符合软件开发思维。

以简单的 2.0 + 4.0 的相加运算为例,在 TensorFlow 1.x 中,首先创建计算图:

import tensorflow as tf
# 1.创建计算图阶段
# 创建 2 个输入端子,指定类型和名字
a_ph = tf.placeholder(tf.float32, name='variable_a')
b_ph = tf.placeholder(tf.float32, name='variable_b')
# 创建输出端子的运算操作,并命名
c_op = tf.add(a_ph, b_ph, name='variable_c')

创建计算图的过程就类比于通过符号建立公式 𝑐 = 𝑎 + 𝑏 的过程,仅仅是记录了公式的计算步骤,并没有实际计算公式的数值结果,还需要通过运行公式的输出端子 𝑐,并赋值 𝑎 =2.0, 𝑏 = 4.0 才能获得 𝑐 的数值结果:

# 2.运行计算图阶段
# 创建运行环境
sess = tf.InteractiveSession()
# 初始化步骤也需要作为操作运行
init = tf.global_variables_initializer()
sess.run(init) # 运行初始化操作,完成初始化
# 运行输出端子,需要给输入端子赋值
c_numpy = sess.run(c_op, feed_dict={a_ph: 2., b_ph: 4.})
# 运算完输出端子才能得到数值类型的 c_numpy
print('a+b=',c_numpy)

可以看到,TensorFlow 1.x 将如此简单的加法运算分为了两个阶段,即创建计算图阶段和运行计算图阶段。

在 TensorFlow 中完成简单的 2.0 + 4.0 尚且如此繁琐,更别说创建复杂的神经网络算法有多艰难,这种先创建计算图后运行的编程方式叫做符号式编程。

接下来我们使用 TensorFlow 2 来完成 2.0 + 4.0 运算:

import tensorflow as tf
# 1.创建输入张量
a = tf.constant(2.)
b = tf.constant(4.)
# 2.直接计算并打印
print('a+b=',a+b)

这种运算时同时创建计算图 𝑎 + 𝑏 和计算数值结果 2.0 + 4.0 的方式叫做命令式编程,也称为动态图优先模式

TensorFlow 2 和 PyTorch 都是采用动态图优先模式开发,调试方便,所见即所得。

一般来说,动态图模型开发效率高,但是运行效率可能不如静态图模式,TensorFlow 2 也支持通过 tf.function 将动态图优先模式的代码转化为静态图模式,实现开发和运行效率的双赢。

© 版权声明
THE END
喜欢就支持一下吧
点赞1赞赏
分享
评论 抢沙发
HarryPotter的头像|艾奇编程网

昵称

取消
昵称表情