在Tensorflow ( v1.2.1)中,似乎存在(至少)两个并行API来构造计算图。在tf.nn中有一些函数,如conv2d、avg_pool、relu、下拉列表,而在tf.layers、tf.losses和其他地方也有类似的函数,如tf.layers.conv2d、tf.layers.dense、tf.layers.dropout。
从表面上看,这种情况似乎只会造成混淆:例如,tf.nn.dropout使用“保持利率”,而tf.layers.dropout使用“下降率”作为参数。
这种区别对最终用户/开发人员有什么实际意义吗?如果没有,是否有计划清除API?
发布于 2017-07-18 09:41:38
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也是对其他框架中用于类似高级功能的人的巨大需求的回答。当您考虑构建在tensorflow之上的其他高级API的数量时,这是相当明显的,例如keras 2(现在的官方tensorflow API的一部分)、slim (在tf.contrib.slim
中)、tflearn、tensorlayer等等。
最后,如果我可以添加一个建议:如果您以tensorflow开头,并且不喜欢特定的API,那么我个人鼓励您坚持使用tf.keras.*
API:
tf.data
)的部分一起使用)tf.contrib.keras
中),并注意使新的tensorflow特性(如eager
)与keras兼容。https://stackoverflow.com/questions/45172725
复制