【问题标题】:Redundancies in tf.keras.backend and tensorflow librariestf.keras.backend 和 tensorflow 库中的冗余
【发布时间】:2019-12-16 17:36:52
【问题描述】:

我已经在 TensorFlow 中工作了大约一年,我正在从 TF 1.x 过渡到 TF 2.0,我正在寻找有关如何在 TF 2.0 中使用 tf.keras.backend 库的一些指导。我知道过渡到 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 函数可以做等效的事情。例如,tf.keras.backend.cast_to_floatx 可以替换为 tf.dtypes.cast,只要您明确指定 dtype。我想知道两件事:

  1. 什么时候最好使用 tf.keras.backend 库而不是等效的 TensorFlow 函数?
  2. 这些函数(以及其他等效的tf.keras.backend 函数)是否存在我缺少的差异?

【问题讨论】:

    标签: tensorflow tensorflow2.0 tf.keras


    【解决方案1】:

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

    更长的答案:

    • tf.keras.backend.* API 可以大部分被视为keras.backend.* API 的残余。后者是为原始(非 TF 特定)keras 的“可交换后端”设计服务的设计。这与 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.lesstf.keras.backend.sin
      2. 围绕 tensorflow 原生 API 的包装器稍厚,包含更多功能。示例:tf.keras.backend.batch_normalizationtf.keras.backend.conv2d(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/backend.py#L4869)。他们经常执行预处理并实现其他逻辑,这比使用原生 tensorflow API 更轻松。
      3. 在原生 tensorflow API 中没有等效的独特函数。示例:tf.keras.backend.rnntf.keras.backend.set_learning_phase

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

    【讨论】:

    • 谢谢!您能否为我澄清一个后续问题:tf.keras.layers 中的层是否使用来自tf.keras.backendtf.nn 的基础设施?例如,tf.keras.layers.Conv1D 使用 tf.keras.backend.conv1d 还是 tf.nn.conv1d
    • tf.keras.layers.* 的内部实现混合使用了tf.keras.backend.* API 和原生 tensorflow API。但是您不需要知道或关心这些内部细节。它们可能会随着时间而改变。
    • 谢谢!我通常会尝试去了解内心,只是因为全面了解细节有助于我保持头脑清醒,但随着版本的变化而变化这一事实是一个好点。
    • 还有一个后续问题...您是否知道您分组到类别 1 的 tf.keras.backend 函数是否有理由对 tf 函数进行单行调用而不是等效的 tf 函数?根据您的描述,这听起来像是 keras API 的残留物,但还有其他原因吗?
    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多