gpt4 book ai didi

Tensorflow - 为什么 tf.nn 和 tf.layers/tf.losses/tf.contrib.layers 等中有这么多相似甚至重复的函数?

转载 作者:行者123 更新时间:2023-12-03 00:44:07 31 4
gpt4 key购买 nike

在 Tensorflow(从 v1.2.1 开始)中,似乎有(至少)两个并行 API 来构建计算图。 tf.nn 中有函数,如 conv2d、avg_pool、relu、dropout,tf.layers、tf.losses 和其他地方也有类似的函数,如 tf.layers.conv2d、tf.layers.dense、tf.layers。辍学。

从表面上看,这种情况似乎只会造成困惑:例如,tf.nn.dropout 使用“保持率”,而 tf.layers.dropout 使用“丢弃率”作为参数。

这种区别对最终用户/开发人员有任何实际用途吗?如果没有,是否有清理 API 的计划?

最佳答案

Tensorflow 一方面提出了低级 API(tf.tf.nn....),另一方面提出了更高级别的 API (tf.layers.tf.losses.、...)。

更高级别 API 的目标是提供大大简化最常见神经网络设计的函数。较低级别的 API 适合有特殊需求的人,或者希望更好地控制正在发生的事情的人。

情况有点困惑,因为有些函数具有相同或相似的名称,而且乍一看没有明确的方法来区分哪个命名空间对应于哪个 API 级别。

现在,让我们以 conv2d 为例。 tf.nn.conv2d 和 tf.layers.conv2d 之间的显着区别在于后者负责权重和偏差所需的所有变量。一行代码,瞧,您刚刚创建了一个卷积层。使用 tf.nn.conv2d,您必须在将权重变量传递给函数之前自行声明权重变量。至于偏差,实际上它们甚至没有得到处理:您需要稍后自己添加它们。

此外,tf.layers.conv2d还建议在同一函数调用中添加正则化和激活,您可以想象当一个人的需求被更高层覆盖时,这可以如何减少代码大小 -级别 API。

高层也会默认做出一些可以被视为最佳实践的决定。例如,默认情况下,tf.losses 中的损失会添加到 tf.GraphKeys.LOSSES 集合中,这使得各个组件的恢复和求和变得容易并且在某种程度上标准化。如果您使用较低级别的 API,则需要自己完成所有这些操作。显然,当您开始在那里混合低级和高级 API 函数时,您需要小心。

更高级别的 API 也满足了人们的巨大需求,这些人已经习惯了除 Theano 之外的其他框架中的类似高级功能。当人们考虑在 tensorflow 之上构建的替代更高级别 API 的数量时,这一点相当明显,例如 keras 2(现在 part of the official tensorflow API )、slim(在 tf.contrib.slim 中)、tflearn、张量层等。

最后,我可以添加一个建议:如果您刚开始使用 TensorFlow 并且对特定 API 没有偏好,我个人鼓励您坚持使用 tf.keras.* API:

  • 其 API 非常友好,并且至少与构建在低级 Tensorflow API 之上的其他高级 API 一样好
  • 它在 Tensorflow 中具有明确的命名空间(尽管它可以(有时应该)与其他命名空间中的部分一起使用,例如 tf.data)
  • 它现在是tensorflow的一等公民(它曾经在tf.contrib.keras中),并注意制作新的tensorflow功能(例如eager) 与 keras 兼容。
  • 它的通用实现可以使用其他工具包,例如 CNTK,因此不会将您锁定到 tensorflow 。

关于Tensorflow - 为什么 tf.nn 和 tf.layers/tf.losses/tf.contrib.layers 等中有这么多相似甚至重复的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45172725/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com