2016-09-15 3 views
10

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

## 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() 

ответ

11

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

2

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

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

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

2

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

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

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