【问题标题】:In tensorflow what is the difference between tf.add and operator (+)?在tensorflow中tf.add和运算符(+)有什么区别?
【发布时间】:2016-10-20 10:13:06
【问题描述】:

在tensorflow教程中,我看到tf.add(tf.matmul(X, W), b)tf.matmul(X, W) + b之类的代码,使用数学函数tf.add()tf.assign()等与运算符+=等有什么区别,在精度还是其他方面?

【问题讨论】:

标签: tensorflow


【解决方案1】:

a+btf.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 实现。

【讨论】:

  • 那么为什么要定义这些tensorflow方法呢?
  • @Hossein 因为我们在 Google 喜欢与众不同。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2018-08-16
      • 2012-10-10
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多