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

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

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

Когда я печатаю продукт, он отображает его как объект Tensor:

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

Но как узнать значение product?

Не помогло следующее:

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

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

Ответ 1

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

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

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

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


[A]: Чтобы напечатать значение тензора, не возвращая его в вашу программу Python, вы можете использовать оператор tf.Print(), как предлагает Анджей в другом ответе. Обратите внимание, что вам все еще нужно запустить часть графика, чтобы увидеть результат этой операции, который выводится на стандартный вывод. Если вы используете распределенный TensorFlow, tf.Print() напечатает его вывод в стандартный вывод задачи, в которой выполняется эта операция. Это означает, что если вы используете, например, https://colab.research.google.com или любую другую записную книжку Jupyter, вы не увидите вывод tf.Print() в записной книжке; в этом случае обратитесь к этому ответу о том, как заставить его печатать еще.

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

Ответ 2

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

Самый простой способ увидеть значение тензора всякий раз, когда граф оценивается (с использованием 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)

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

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

Ответ 3

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

Простой фрагмент для тех, кто ищет простой пример для печати значений, приведен ниже. Код может быть выполнен без каких-либо изменений в ноутбуке 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]]

Ответ 4

Нет, вы не можете видеть содержимое тензора без выполнения графика (делаем 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))

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

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

Ответ 5

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

  • тензоры
  • Операции
  • Сессия
  • Графы

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

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

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

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

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

Ответ 6

В недавнем Tensorflow 1.13.1

import tensorflow as tf
tf.enable_eager_execution()
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

В Tensorflow 2.0 режим ожидания включен по умолчанию. поэтому следующий код работает с TF2.0.

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

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

Ответ 7

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

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

Ответ 8

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

Просто добавьте следующие две строки кода: import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

сразу после import tensorflow.

Результатом вывода print product в ваш пример будет: tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

Обратите внимание, что на данный момент (ноябрь 2017 года) вам придется установить ночную сборку Tensorflow, чтобы обеспечить надежное выполнение. Здесь можно найти готовые колеса.

Ответ 9

Обратите внимание, что 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

Ответ 10

Вы должны думать о программах 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, а затем вызывает его метод run для выполнения достаточного количества вычислительного графа для оценки product:

sess = tf.Session()
// run variables initializer
sess.run(init)

print(sess.run([product]))

Ответ 11

tf.keras.backend.eval полезно для оценки небольших выражений.

tf.keras.backend.eval(op)

TF 1.x и TF 2.0 совместимы.


Минимальный проверяемый пример

from tensorflow.keras.backend import eval

m1 = tf.constant([[3., 3.]])
m2 = tf.constant([[2.],[2.]])

eval(tf.matmul(m1, m2))
# array([[12.]], dtype=float32)

Это полезно, потому что вам не нужно явно создавать Session или InteractiveSession.

Ответ 12

Попробуйте этот простой код! (самоочевидно)

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)

Ответ 13

Мне нелегко было понять, что требуется, даже прочитав все ответы, пока я не выполнил это. TensofFlow новичок и для меня.

def printtest():
x = tf.constant([1.0, 3.0])
x = tf.Print(x,[x],message="Test")
init = (tf.global_variables_initializer(), tf.local_variables_initializer())
b = tf.add(x, x)
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(b))
    sess.close()

Но все же вам может понадобиться значение, возвращаемое при выполнении сеанса.

def printtest():
    x = tf.constant([100.0])
    x = tf.Print(x,[x],message="Test")
    init = (tf.global_variables_initializer(), tf.local_variables_initializer())
    b = tf.add(x, x)
    with tf.Session() as sess:
        sess.run(init)
        c = sess.run(b)
        print(c)
        sess.close()

Ответ 14

В Tensorflow 2. 0+ (или в среде режима Eager) вы можете вызвать .numpy():

import tensorflow as tf

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

print(product.numpy()) 

Ответ 15

Вы можете использовать Keras, однострочный ответ будет использовать метод eval следующим образом:

import keras.backend as K
print(K.eval(your_tensor))

Ответ 16

По сути, в тензорном потоке, когда вы создаете тензор любого рода, они создаются и хранятся внутри, к которым можно получить доступ только при запуске сеанса тензорного потока. Скажем, вы создали постоянный тензор
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
Без проведения сеанса вы можете получить
op: Операция. Операция, которая вычисляет этот тензор.
- value_index: Int. Индекс конечной точки операции, которая производит этот тензор.
- dtype: тип DT. Тип элементов хранится в этом тензоре.

Чтобы получить значения, вы можете запустить сеанс с нужным вам тензором:

with tf.Session() as sess:
    print(sess.run(c))
    sess.close()

Вывод будет примерно таким:

массив ([[1., 2., 3.], [4., 5., 6.]], dtype = float32)

Ответ 17

Используя советы из https://www.tensorflow.org/api_docs/python/tf/print, я использую функцию log_d для печати отформатированных строк.

import tensorflow as tf

def log_d(fmt, *args):
    op = tf.py_func(func=lambda fmt_, *args_: print(fmt%(*args_,)),
                    inp=[fmt]+[*args], Tout=[])
    return tf.control_dependencies([op])


# actual code starts now...

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

with log_d('MAT1: %s, MAT2: %s', matrix1, matrix2): # this will print the log line
    product = tf.matmul(matrix1, matrix2)

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

Ответ 18

import tensorflow as tf
sess = tf.InteractiveSession()
x = [[1.,2.,1.],[1.,1.,1.]]    
y = tf.nn.softmax(x)           

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

print(product.eval())
tf.reset_default_graph()
sess.close()

Ответ 19

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

Ответ:

import tensorflow as tf

# Variable
x = tf.Variable([[1,2,3]])

# initialize
init = (tf.global_variables_initializer(), tf.local_variables_initializer())

# Create a session
sess = tf.Session()

# run the session
sess.run(init)

# print the value
sess.run(x)

Ответ 20

Включите активное выполнение, которое представлено в tenorflow после версии 1.10. Это очень просто в использовании.

# Initialize session
import tensorflow as tf
tf.enable_eager_execution()


# Some tensor we want to print the value of
a = tf.constant([1.0, 3.0])

print(a)