在tensorflow中,tf.add和operator(+)之间有什么区别?

pla*_*nor 40 tensorflow

在tensorflow教程,我看到像两个代码tf.add(tf.matmul(X, W), b)tf.matmul(X, W) + b,就是用数学函数的区别tf.add(),tf.assign()等和运营商+=等,在精度或其他方面?

Yar*_*tov 50

a+b和之间的精度没有区别tf.add(a, b).前者通过math_ops.py中的跟随行转换为a.__add__(b)映射到tf.add的映射

_OverrideBinaryOperatorHelper(gen_math_ops.add, "add")

唯一的区别是底层Graph中的节点名称add而不是Add.您通常可以通过查看这样的基础Graph表示来比较事物

tf.reset_default_graph()
dtype = tf.int32
a = tf.placeholder(dtype)
b = tf.placeholder(dtype)
c = a+b
print(tf.get_default_graph().as_graph_def())
Run Code Online (Sandbox Code Playgroud)

您也可以通过检查__add__方法直接看到这一点.有一个额外的间接级别,因为它是一个闭包,但你可以得到如下的底层函数

real_function = tf.Tensor.__add__.im_func.func_closure[0].cell_contents
print(real_function.__module__ + "." + real_function.__name__)
print(tf.add.__module__ + "." + tf.add.__name__)
Run Code Online (Sandbox Code Playgroud)

你会看到下面的输出意味着他们调用相同的底层函数

tensorflow.python.ops.gen_math_ops.add
tensorflow.python.ops.gen_math_ops.add
Run Code Online (Sandbox Code Playgroud)

您可以从tf.Tensor.OVERLOADABLE_OPERATORS下面看到Python特殊方法可能会被适当的TensorFlow版本重载

{'__abs__',
 '__add__',
 '__and__',
 '__div__',
 '__floordiv__',
 '__ge__',
 '__getitem__',
 '__gt__',
 '__invert__',
 '__le__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__neg__',
 '__or__',
 '__pow__',
 '__radd__',
 '__rand__',
 '__rdiv__',
 '__rfloordiv__',
 '__rmod__',
 '__rmul__',
 '__ror__',
 '__rpow__',
 '__rsub__',
 '__rtruediv__',
 '__rxor__',
 '__sub__',
 '__truediv__',
 '__xor__'}
Run Code Online (Sandbox Code Playgroud)

Python参考3.3.7中描述了这些方法:模拟数字类型.请注意,Python数据模型不提供重载赋值运算符的方法,=因此赋值始终使用本机Python实现.

  • 那么为什么要定义这些张量流方法呢? (9认同)
  • @Hossein因为我们在谷歌喜欢额外的. (2认同)

Sal*_*ali 11

雅罗斯拉夫很好地解释说没有真正的区别。我只会在使用tf.add有益时添加。

tf.add有一个重要参数,即name. 它允许您在张量板中可见的图形中命名操作。所以我的经验法则是,如果在 tensorboard 中命名一个操作会有好处,我会使用tf.等效的,否则我会为了简洁而使用重载的版本。