Подтвердить что ты не робот

В тензорном потоке какая разница между tf.add и operator (+)?

В обучающих программах tensorflow я вижу оба кода типа tf.add(tf.matmul(X, W), b) и tf.matmul(X, W) + b, в чем разница между использованием математической функции tf.add(), tf.assign() и т.д. и операторами + и = и т.д., в точности или в других аспектах?

4b9b3361

Ответ 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.