Ответ 1
Четыре приведенных вами примера будут давать одинаковый результат и сгенерировать один и тот же граф (если вы проигнорируете, что некоторые имена операций на графике отличаются). TensorFlow преобразует множество различных объектов Python в объекты tf.Tensor
, когда они передаются в качестве аргументов для операторов TensorFlow, таких как tf.add()
здесь. Оператор +
является просто простой оболочкой на tf.add()
, а перегрузка используется, когда либо левый, либо правый аргумент tf.Tensor
(или tf.Variable
).
Учитывая, что вы можете просто передать много объектов Python операторам TensorFlow, зачем вам когда-либо использовать tf.constant()
? Существует несколько причин:
-
Если вы используете один и тот же объект Python в качестве аргумента для нескольких разных операций, TensorFlow будет преобразовывать его в тензор несколько раз и представлять каждый из этих тензоров в графе. Поэтому, если ваш объект Python является большим массивом NumPy, у вас может закончиться нехватка памяти, если вы сделаете слишком много копий данных этого массива. В этом случае вам может потребоваться преобразовать массив в
tf.Tensor
один раз -
Создание
tf.constant()
явно позволяет вам установить его свойствоname
, которое может быть полезно для отладки TensorBoard и визуализации графа. (Обратите внимание, что по умолчанию TensorFlow ops попытается дать значащее имя каждому автоматически преобразованному тензору, основанному на имени аргумента op.) -
Создание
tf.constant()
явно позволяет вам установить точный тип элемента тензора. TensorFlow преобразует объекты Pythonint
вtf.int32
иfloat
объекты вtf.float32
. Если вы хотитеtf.int64
илиtf.float64
, вы можете получить это, передав одно и то же значение вtf.constant()
и передав явный аргументdtype
. -
Функция
tf.constant()
также предлагает полезную функцию при создании больших тензоров с повторяющимся значением:c = tf.constant(17.0, shape=[1024, 1024], dtype=tf.float32)
Тензор
c
выше представляет 4 * 1024 * 1024 байта данных, но TensorFlow будет представлять его компактно на графике как единую float17.0
плюс информацию о форме, которая указывает, как ее следует интерпретировать. Если у вас на вашем графике много больших заполненных констант, их можно создать более эффективно.