Простые операции TensorFlow: тензоры против переменных Python

Я не уверен в практических различиях между четырьмя вариантами ниже (все они оцениваются с одинаковым значением). Я понимаю, что если я вызову tf, он создаст операцию на графике, и в противном случае это может произойти. Если я не создаю tf.constant() в начале, я считаю, что константы будут созданы неявно при выполнении добавления; но для tf.add(a,b) vs a + b, где a и b - оба тензора (# 1 и # 3), я не вижу различий, кроме имени по умолчанию (прежний - Add, а последний - Add). Может ли кто-нибудь пролить свет на различия между ними, и когда следует использовать их каждый?

## 1
a = tf.constant(1)
b = tf.constant(1)
x = tf.add(a, b)
with tf.Session() as sess:
    x.eval()

## 2
a = 1
b = 1
x = tf.add(a, b)
with tf.Session() as sess:
    x.eval()

## 3
a = tf.constant(1)
b = tf.constant(1)
x = a + b
with tf.Session() as sess:
    x.eval()

## 4
a = 1
b = tf.constant(1)
x = a + b
with tf.Session() as sess:
    x.eval()

Ответ 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 преобразует объекты Python int в 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 будет представлять его компактно на графике как единую float 17.0 плюс информацию о форме, которая указывает, как ее следует интерпретировать. Если у вас на вашем графике много больших заполненных констант, их можно создать более эффективно.

Ответ 2

Они все одинаковые.

Питон - '+' в + b захватывается с помощью тензорного потока и фактически генерирует тот же самый op, что и tf.add(a, b).

tf.conctant позволяет вам более подробно описывать форму, тип и имя созданного тензора. Но снова tenorflow владеет тем, что "a" в вашем примере a = 1, и он эквивалентен tf.constant(1) (рассматривая константу как значение int в этом случае)

Ответ 3

Результат тот же, потому что каждый оператор (add или __add__, перегруженный +) вызывает tf.convert_to_tensor для своих операндов.

Разница между tf.add(a + b) и a + b заключается в том, что первый дает вам возможность дать имя операции с параметром name. Последнее, напротив, не дает вам этой возможности, а также делает возможным, чтобы вычисления выполнялись интерпретатором Python, а не вне его, в среде Tensorflow.

Это происходит, если (и только если) и a и b не являются объектами Tensor и, следовательно, Tensorflow не будет участвовать в вычислениях.