tensorflow学习笔记: 1.X 和2.X版本的差异

      近日电脑环境出了点问题,整个重装后tensorflow更新到2.0版本。结果运行以往的程序是抛出了很多bug,走了很多路也踩过很多坑。且行且调试吧。。。

       TensorFlow具有多种语言可用的API,可用于构建和执行TensorFlow图。Python API目前是最完整和最容易使用的,但是其他语言API可能更易于集成到项目中,并且可能在图形执行方面提供一些性能优势。

TensorFlow 2

       TensorFlow 2.0中进行了多项更改,以使TensorFlow用户更加高效。TensorFlow 2.0删除了 冗余API,使API更加一致(统一RNN, 统一优化器),并通过Eager执行更好地与Python运行时集成 。

       许多 RFC 解释了TensorFlow 2.0的变化。

和tensorflow 1相比的重大变化简要

API清理

在TF 2.0中,许多API都已 消失或移动。一些主要的变化包括删除tf.apptf.flags以及 tf.logging有利于现在开源的 ABSL-PY,重新指定主lgroup是住在项目 tf.contrib,并清理主要tf.*通过移动较少使用的功能到像子包的命名空间tf.math。一些API已替换为自己的2.0当量- tf.summarytf.keras.metricstf.keras.optimizers。自动应用这些重命名的最简单方法是使用v2升级脚本。

Eager execution

TensorFlow 1.X要求用户通过调用API 手动将抽象语法树(图形)拼接在一起 tf.*。然后,它要求用户通过将一组输出张量和输入张量传递给session.run()调用来手动编译抽象语法树。TensorFlow 2.0急切地执行(就像Python通常那样),并且在2.0中,图形和会话应该感觉像实现细节。

急切执行的一个显着副产品tf.control_dependencies()是不再需要,因为所有代码行均按顺序执行(在内tf.function,具有副作用的代码按写入的顺序执行)。

没有更多的全局变量

TensorFlow 1.X严重依赖隐式全局名称空间。当您调用时 tf.Variable(),即使您丢失了指向它的Python变量的跟踪信息,它也将被放入默认图形中,并且将保留在那里。然后,您可以恢复它tf.Variable,但前提是您知道创建该文件的名称。如果您无法控制变量的创建,则很难做到这一点。其结果是,机制各种增殖试图帮助用户重新找到自己的变量,并为框架,以查找用户创建的变量:变量的作用域,全球集合,辅助方法一样tf.get_global_step()tf.global_variables_initializer(),优化隐式计算在所有训练的变量梯度,并以此类推。TensorFlow 2.0消除了所有这些机制(Variables 2.0 RFC),支持默认机制:跟踪变量!如果您找不到 tf.Variable,则会收集垃圾。

跟踪变量的要求为用户带来了一些额外的工作,但是对于Keras对象(请参见下文),负担最小化。

功能而不是会话

一个session.run()几乎就像一个函数调用:您指定的输入和函数被调用,你回来一组输出。在TensorFlow 2.0中,您可以使用tf.function()来装饰Python函数以将其标记为JIT编译,以便TensorFlow将其作为单个图形运行(Functions 2.0 RFC)。该机制使TensorFlow 2.0能够获得图形模式的所有优势:

  • 性能:可以优化功能(节点修剪,内核融合等)
  • 可移植性:可以导出/重新导入该函数(SavedModel 2.0 RFC),允许用户重用和共享模块化TensorFlow函数。
# TensorFlow 1.X
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)

借助自由散布Python和TensorFlow代码的功能,用户可以利用Python的表现力。但是可移植的TensorFlow在没有Python解释器的上下文中执行,例如移动,C ++和JavaScript。为了帮助用户避免在添加时不得不重写其代码@tf.function, AutoGraph将Python构造的子集转换为其TensorFlow等效项:

  • forwhile-> tf.while_loopbreak并且continue受支持)
  • if -> tf.cond
  • for _ in dataset -> dataset.reduce

AutoGraph支持控制流的任意嵌套,这使得可以高效,简洁地实现许多复杂的ML程序,例如序列模型,强化学习,自定义训练循环等。

你可能感兴趣的:(tensorflow)