【发布时间】:2016-10-20 10:13:06
【问题描述】:
在tensorflow教程中,我看到tf.add(tf.matmul(X, W), b)和tf.matmul(X, W) + b之类的代码,使用数学函数tf.add()、tf.assign()等与运算符+和=等有什么区别,在精度还是其他方面?
【问题讨论】:
标签: tensorflow
在tensorflow教程中,我看到tf.add(tf.matmul(X, W), b)和tf.matmul(X, W) + b之类的代码,使用数学函数tf.add()、tf.assign()等与运算符+和=等有什么区别,在精度还是其他方面?
【问题讨论】:
标签: tensorflow
a+b 和 tf.add(a, b) 之间的精度没有区别。前者转换为a.__add__(b),后者通过math_ops.py 中的following line 映射到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())
您也可以通过检查__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 实现。
【讨论】:
雅罗斯拉夫很好地解释说没有真正的区别。我会在使用tf.add 有益时添加。
tf.add 有一个重要的参数是name。它允许您在图形中命名操作,该图形将在 tensorboard 中可见。所以我的经验法则是,如果在 tensorboard 中命名一个操作是有益的,我会使用 tf. 等价物,否则我会为了简洁而使用重载版本。
【讨论】:
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]。
【讨论】: