Как напечатать значение объекта Tensor в TensorFlow?

Я использовал вводный пример умножения матрицы в TensorFlow.

matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) 

И когда я печатаю продукт, он отображает его как TensorObject (очевидно).

продукт

 <tensorflow.python.framework.ops.Tensor object at 0x10470fcd0> 

Но как узнать стоимость product ?

Следующее не помогает:

 print product Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32) 

Я знаю, что графики выполняются на Sessions , но разве нет возможности проверить вывод TensorObject без запуска графика в session ?

9 Solutions collect form web for “Как напечатать значение объекта Tensor в TensorFlow?”

Самый простой способ оценить фактическое значение объекта Tensor – передать его методу Session.run() или вызвать Tensor.eval() когда у вас есть сеанс по умолчанию (т. with tf.Session(): a with tf.Session(): блок или см. ниже). В общем случае ** вы не можете распечатать значение тензора, не запуская какой-либо код в сеансе.

Если вы экспериментируете с моделью программирования и хотите легко оценить тензоры, tf.InteractiveSession позволяет вам открыть сеанс в начале вашей программы, а затем использовать этот сеанс для всех Tensor.eval()Operation.run() ). Это может быть проще в интерактивных настройках, таких как оболочка или IPython-ноутбук, когда утомительно передавать объект Session повсюду.

Это может показаться глупым для такого небольшого выражения, но одна из ключевых идей в Tensorflow – это отсроченное исполнение : очень дешево создавать большое и сложное выражение, а когда вы хотите его оценить, back-end (к которому вы подключаетесь с Session ) может планировать свое исполнение более эффективно (например, параллельно выполнять независимые части и использовать графические процессоры).


* Чтобы напечатать значение тензора, не возвращая его в вашу программу Python, вы можете использовать оператор tf.Print() , как предлагает Andrzej в другом ответе . Обратите внимание, что вам все равно нужно запустить часть графика, чтобы увидеть результат этого op, который выводится на стандартный вывод. Если вы используете распределенный tf.Print() , tf.Print() будет выводить свой вывод на стандартный вывод задачи, в которой работает этот op.

** Возможно, вы сможете использовать экспериментальную tf.contrib.util.constant_value() чтобы получить значение константного тензора, но оно не предназначено для общего использования, и оно не определено для многих операторов.

В то время как другие ответы верны, что вы не можете распечатать значение до тех пор, пока вы не оцените график, они не говорят об одном простом способе фактической печати значения внутри графика, как только вы его оцениваете.

Самый простой способ увидеть значение тензора всякий раз, когда граф оценивается (с использованием run или eval ), заключается в использовании операции Print как в этом примере:

 # Initialize session import tensorflow as tf sess = tf.InteractiveSession() # Some tensor we want to print the value of a = tf.constant([1.0, 3.0]) # Add print operation a = tf.Print(a, [a], message="This is a: ") # Add more elements of the graph using a b = tf.add(a, a).eval() 

Теперь, всякий раз, когда мы оцениваем весь график, например, используя b.eval() , получаем:

 I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3] 

Нет, вы не можете видеть содержимое тензора без выполнения графика (выполнение session.run() ). Единственное, что вы можете увидеть:

  • размерность тензора (но я полагаю, что нетрудно вычислить его для списка операций, которые имеет TF)
  • тип операции, которая будет использоваться для генерации тензора ( transpose_1:0 , random_uniform:0 )
  • тип элементов в тензоре ( float32 )

Я не нашел это в документации, но считаю, что значения переменных (а некоторые константы не вычисляются во время присвоения).


Взгляните на этот пример:

 import tensorflow as tf from datetime import datetime dim = 7000 

Первый пример, когда я просто начинаю постоянный тензор случайных чисел, работает примерно в одно и то же время независимо от dim ( 0:00:00.003261 )

 startTime = datetime.now() m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) print datetime.now() - startTime 

Во втором случае, когда константа фактически оценивается и присваиваются значения, время явно зависит от dim ( 0:00:01.244642 )

 startTime = datetime.now() m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) sess = tf.Session() sess.run(m1) print datetime.now() - startTime 

И вы можете сделать это более понятным, вычислив что-то ( d = tf.matrix_determinant(m1) , имея в виду, что время будет работать в O(dim^2.8) )

PS Я нашел, было объяснено в документации :

Объект Tensor является символьным дескриптором результата операции, но фактически не удерживает значения вывода операции.

Повторяя то, что говорили другие, невозможно проверить значения без выполнения графика.

Простой фрагмент для тех, кто ищет простой пример для печати значений, приведен ниже. Код может быть выполнен без каких-либо изменений в ноутбуке ipython

 import tensorflow as tf #define a variable to hold normal random values normal_rv = tf.Variable( tf.truncated_normal([2,3],stddev = 0.1)) #initialize the variable init_op = tf.initialize_all_variables() #run the graph with tf.Session() as sess: sess.run(init_op) #execute init_op #print the random values that we sample print (sess.run(normal_rv)) 

Вывод:

 [[-0.16702934 0.07173464 -0.04512421] [-0.02265321 0.06509651 -0.01419079]] 

Основываясь на ответах выше, с вашим конкретным фрагментом кода вы можете распечатать продукт следующим образом:

 import tensorflow as tf #Initialize the session sess = tf.InteractiveSession() matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) #print the product print(product.eval()) #close the session to release resources sess.close() 

Я думаю, вам нужно правильно понять некоторые основы. С приведенными выше примерами вы создали тензоры (многомерный массив). Но для того, чтобы поток тензора действительно работал, вы должны инициировать « сеанс » и запускать свою « операцию » в сеансе. Обратите внимание на слово «сеанс» и «операция». Вам нужно знать 4 вещи для работы с тензорным потоком:

  1. тензоры
  2. операции
  3. сессии
  4. диаграммы

Теперь из того, что вы выписали, вы дали тензор и операцию, но у вас нет сеанса и графика. Тензор (края графа) проходит через графики и управляется операциями (узлами графика). Существует график по умолчанию, но вы можете инициировать сеанс в сеансе.

Когда вы говорите «Печать», вы получаете доступ только к форме переменной или константы, которую вы определили.

Итак, вы можете видеть, чего не хватает:

  with tf.Session() as sess: print(sess.run(product)) print (product.eval()) 

Надеюсь, поможет!

Вы должны думать о программах TensorFlow Core как состоящих из двух дискретных разделов:

  • Построение вычислительного графа.
  • Запуск вычислительного графа.

Итак, для кода ниже вы просто создаете вычислительный граф.

 matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) 

Вам также необходимо инициализировать все переменные в программе TensorFlow, вы должны явно вызвать специальную операцию следующим образом:

 init = tf.global_variables_initializer() 

Теперь вы строите график и инициализировали все переменные, следующим шагом для оценки узлов, вы должны запустить вычислительный граф в течение сеанса. Сеанс инкапсулирует управление и состояние среды выполнения TensorFlow.

Следующий код создает объект Session, а затем вызывает его метод запуска для достаточного вычисления вычислительного графика для оценки product :

 sess = tf.Session() // run variables initializer sess.run(init) print(sess.run([product])) 

Попробуйте этот простой код! (он сам объясняет)

 import tensorflow as tf sess = tf.InteractiveSession() # see the answers above :) x = [[1.,2.,1.],[1.,1.,1.]] # a 2D matrix as input to softmax y = tf.nn.softmax(x) # this is the softmax function # you can have anything you like here u = y.eval() print(u) 

Обратите внимание, что tf.Print() изменит имя тензора. Если тензор, который вы пытаетесь распечатать, является заполнителем, подача данных на него не удастся, поскольку исходное имя не будет найдено во время кормления. Например:

 import tensorflow as tf tens = tf.placeholder(tf.float32,[None,2],name="placeholder") print(eval("tens")) tens = tf.Print(tens,[tens, tf.shape(tens)],summarize=10,message="tens:") print(eval("tens")) res = tens + tens sess = tf.Session() sess.run(tf.global_variables_initializer()) print(sess.run(res)) 

Выход:

 python test.py Tensor("placeholder:0", shape=(?, 2), dtype=float32) Tensor("Print:0", shape=(?, 2), dtype=float32) Traceback (most recent call last): [...] InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'placeholder' with dtype float 
  • Создайте граф, который работает с переменным размером партии, используя Tensorflow
  • Ошибка при запуске Tensorflow Sequence to Sequence Tutorial
  • Tensorflow создает файл tfrecords из csv
  • Пользовательская метрика, основанная на потоковых метриках tensorflow, возвращает NaN
  • Почему значение `tf.constant ()` хранится несколько раз в памяти в TensorFlow?
  • Как добавить новый op в распределенный Tensorflow?
  • Как рассчитать убыток без обновления модели в тензорном потоке
  • tensorflow: AttributeError: объект 'module' не имеет атрибута 'mul'
  • Как преобразовать тензор в массив numpy в TensorFlow?
  • ValueError при попытке оценить новый экземпляр данных в тензорном потоке
  • Восстановление модели TensorFlow
  • Python - лучший язык программирования в мире.