【问题标题】:Why does TensorFlow recommends the "functional style for constructing operations"?为什么TensorFlow推荐“构造操作的函数式”?
【发布时间】:2019-04-30 08:57:41
【问题描述】:

TensorFlow's documentation,可以找到以下文字:

// Not recommended
MatMul m(scope, a, b);

// Recommended
auto m = MatMul(scope, a, b);

我认为使用“推荐”样式没有明显的好处。第一个版本至少更短。此外,“推荐”版本可能包含更多与不必要的分配操作相关的操作。

我已阅读该文档页面不少于六次,但仍然无法理解其推理背后的基本原理。

这个建议只是风格问题还是第二个版本有一些好处?

【问题讨论】:

  • 我认为这个想法是为了统一而以相同的方式对待函数和类。从概念上讲,将MatMul 视为一个函数而不是一个类可能更有意义,因此它更像是“mab 相乘的结果”,而不是“m 是一个乘法”以ab 作为参数的操作”。它允许您编写执行一系列操作的实际函数并以相同的方式使用它们。我认为它通常更接近您在 Python 中获得的“API 感觉”。
  • 另一个原因(尽管@StoryTellers 链接更合理)可能是文本对齐。如果您有不同名称长度的不同类型,如果所有变量都定义为 auto xyz = ... 并因此以相同数量的缩进开始(类似于尾随返回类型),您的代码可能更易于阅读。

标签: c++ tensorflow constructor


【解决方案1】:

此外,“推荐”版本可能包含更多与不必要的赋值操作相关的操作。

没有任务。是初始化。原则上可能存在的任何额外对象在任何值得使用的编译器中都会完全省略。

您引用的建议与Herb Sutter's "Almost Always Auto" advice 一致。支持这种风格的最强点(完全公开,我不遵循)是它不可能让变量保持未初始化状态。

auto foo; // ill-formed.
int foo; // indeterminate value
auto foo = int(); // a zero integer

当然,一个好的静态分析工具也可以警告它,但它仍然是一个非常强的地方,不需要编译器或外部工具进行额外的分析。

除此之外,风格论点是它还使您的代码与您出于理智而使用auto 的情况保持一致,例如

auto it = myVec.begin();

但是 YMMV 在所有方面。它最终将成为一种风格选择,无论选择哪种风格,两种风格都存在例外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多