在tensorflow中,tf.add和运算符(+;)之间有什么区别?
在tensorflow教程中,我看到了两种代码,如在tensorflow中,tf.add和运算符(+;)之间有什么区别?,tensorflow,Tensorflow,在tensorflow教程中,我看到了两种代码,如tf.add(tf.matmul(X,W),b)和tf.matmul(X,W)+b,使用数学函数tf.add(),tf.assign()等与运算符+/code>和=/code>等在精度或其他方面有什么区别 在a+b和tf之间精度没有差异。添加(a,b)。前者转换为a.\uuu add\uu(b),通过in-math\u ops.py映射到tf.add \u覆盖NaryOperatorHelper(gen\u math\u ops.add,“add
tf.add(tf.matmul(X,W),b)
和tf.matmul(X,W)+b
,使用数学函数tf.add()
,tf.assign()
等与运算符+/code>和=/code>等在精度或其他方面有什么区别 在a+b
和tf之间精度没有差异。添加(a,b)
。前者转换为a.\uuu add\uu(b)
,通过in-math\u ops.py映射到tf.add
\u覆盖NaryOperatorHelper(gen\u math\u ops.add,“add”)
唯一的区别是基础图中的节点名是add
,而不是add
。您通常可以通过如下方式查看底层的图形表示来进行比较
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())
您还可以通过检查\uuuuu添加\uuuu
方法直接看到这一点。因为它是一个闭包,所以有一个额外的间接层,但是您可以得到如下的底层函数
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_运算符中看到,以下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数据模型不提供重载赋值运算符的方法,因此赋值始终使用本机Python实现。Yaroslav很好地解释了这两者之间没有真正的区别。当使用tf时,我将只添加。添加是有益的
有一个重要参数,即名称
。它允许您在tensorboard中可见的图形中命名操作。所以我的经验法则是,如果在tensorboard中命名一个操作是有益的,我会使用tf.
equired,否则我会力求简洁并使用重载版本
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
打印的值将是[1,1,1,1,1,1,1,1,1]
,那么为什么要定义这些tensorflow方法呢?@Hossein,因为我们谷歌喜欢额外的。可能的重复