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

时间:2016-06-18 19:19:27

标签: tensorflow

在tensorflow教程中,我看到tf.add(tf.matmul(X, W), b)tf.matmul(X, W) + b这两个代码,使用数学函数tf.add()tf.assign()等和运算符{之间的区别是什么? {1}}和+等在精确度或其他方面?

3 个答案:

答案 0 :(得分:46)

a+btf.add(a, b)之间的精确度没有差异。前者转换为a.__add__(b),在math_ops.py

中通过following line映射到tf.add

_OverrideBinaryOperatorHelper(gen_math_ops.add, "add")

唯一的区别是底层图表中的节点名称是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())

您也可以通过检查__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__)

您将看到下面的输出,这意味着他们调用相同的基础功能

tensorflow.python.ops.gen_math_ops.add
tensorflow.python.ops.gen_math_ops.add

您可以从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__'}

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

答案 1 :(得分:3)

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

tf.add有一个重要的参数,即name。它使您可以在张量图中可见的图形中命名操作。因此,以我的经验法则,如果在tensorboard中命名操作将是有益的,那么我将使用tf.等效项,否则为了简洁起见,请使用重载版本。

答案 2 :(得分:-1)

null

现在,打印的a = [1,1,1,1] b = [1,1,1,1] w = tf.add(a, b) with tf.Session() as sess: p = sess.run(w) print(p) a+b 的值为p,简单的[2,2,2,2]打印的值为a+b