В обучающих программах tensorflow я вижу оба кода типа tf.add(tf.matmul(X, W), b)
и tf.matmul(X, W) + b
, в чем разница между использованием математической функции tf.add()
, tf.assign()
и т.д. и операторами +
и =
и т.д., в точности или в других аспектах?
В тензорном потоке какая разница между tf.add и operator (+)?
Ответ 1
Нет никакой разницы в точности между a+b
и tf.add(a, b)
. Первый преобразуется в a.__add__(b)
, который преобразуется в tf.add
с помощью следующей строки в файле math_ops.py
_OverrideBinaryOperatorHelper(gen_math_ops.add, "add")
Единственное различие заключается в том, что имя node в базовом графе 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.