在tensorflow教程中,我看到tf.add(tf.matmul(X, W), b)
和tf.matmul(X, W) + b
这两个代码,使用数学函数tf.add()
,tf.assign()
等和运算符{之间的区别是什么? {1}}和+
等在精确度或其他方面?
答案 0 :(得分:46)
a+b
和tf.add(a, b)
之间的精确度没有差异。前者转换为a.__add__(b)
,在math_ops.py
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
。