tf.keras.backend 和 tensorflow 库中的冗余

Redundancies in tf.keras.backend and tensorflow libraries

我已经在 TensorFlow 工作了大约一年,我正在从 TF 1.x 过渡到 TF 2.0,我正在寻找有关如何使用 tf.keras.backend 库的一些指导在 TF 2.0 中。我知道过渡到 TF 2.0 应该会消除建模和构建图形中的大量冗余,因为在早期的 TensorFlow 版本中有很多方法可以创建等效层(我非常感谢这种变化!),但我我陷入了理解何时使用 tf.keras.backend 的困境,因为这些操作对于其他 TensorFlow 库来说似乎是多余的。

我看到 tf.keras.backend 中的一些函数与其他 TensorFlow 库是多余的。例如,tf.keras.backend.abstf.math.abs 不是别名(或者至少,它们没有在文档中列为别名),但它们都采用张量的绝对值。查看源代码后,好像是tf.keras.backend.abs调用了tf.math.abs函数,所以我真的不明白为什么它们不是别名。其他 tf.keras.backend 操作在 TensorFlow 库中似乎没有重复,但似乎有 TensorFlow 函数可以做同样的事情。例如,只要明确指定 dtype,tf.keras.backend.cast_to_floatx 就可以替换为 tf.dtypes.cast。我想知道两件事:

  1. 什么时候最好使用 tf.keras.backend 库而不是等效的 TensorFlow 函数?
  2. 我遗漏的这些函数(以及其他等效的 tf.keras.backend 函数)有什么不同吗?

简短回答:尽可能选择 tensorflow 的原生 API,例如 tf.math.* 而不是 tf.keras.backend.* API。

更长的答案:

  • tf.keras.backend.*API可以大部分视为keras.backend.*API的残余。后者是服务于原始(非TF特定)keras的"exchangeable backend"设计的设计。这涉及到keras的历史方面,它支持多种后端库,其中tensorflow曾经只是其中之一。早在 2015 年和 2016 年,Theano 和 MXNet 等其他后端也很受欢迎。但进入 2017 年和 2018 年,tensorflow 成为 keras 用户的主要后端。最终 keras 成为了 tensorflow API 的一部分(在 2.x 和后来的 1.x 的次要版本中)。在旧的多后端世界中,backend.* API 提供了对无数受支持后端的独立于后端的抽象。但是在tf.keras的世界里,后端API的价值就更有限了。
  • tf.keras.backend.*中的各种函数可以分为几类:
    1. 围绕等效或大部分等效的 tensorflow 本机 API 进行精简包装。示例:tf.keras.backend.less, tf.keras.backend.sin
    2. tensorflow 原生 APIs 周围的包装稍微厚一些,包含更多功能。示例:tf.keras.backend.batch_normalization, tf.keras.backend.conv2d(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/backend.py#L4869)。他们经常执行处理并实现其他逻辑,这比使用原生 tensorflow API.
    3. 让您的生活更轻松
    4. 在原生 tensorflow 中没有等效的独特函数 API。示例:tf.keras.backend.rnn, tf.keras.backend.set_learning_phase

对于类别 1,使用原生 tensorflow APIs。对于类别 2 和 3,您可能想要使用 tf.keras.backend.* API,只要您可以在文档页面中找到它:https://www.tensorflow.org/api_docs/python/,因为文档中的那些具有向后兼容性保证,这样您就不必担心未来版本的 tensorflow 会删除它或改变它的行为。