2015-11-10 4 views
131

Я использую вводный пример умножения матрицы в TensorFlow.Как напечатать значение объекта Tensor в 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?

ответ

134

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

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

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


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

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

+8

Возможно получить некоторые атрибуты тензора без вызова Session.run(). Например, вы можете вызвать tensor.get_shape(). Во многих случаях это дает достаточно информации для отладки. –

+3

См. Также И ответ о tf.Print op ниже. Я продолжаю находить этот ответ stackoverflow во время googling для «tenorflow print», и этот главный ответ заставляет его звучать так, как будто нет tf.Print op. –

+1

Я добавил некоторые предостережения в ответ, так что теперь должно быть яснее. (Я не думаю, что исходный вопросник интересовался получением формы тензора, просто значением.) – mrry

15

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

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

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


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

import tensorflow as tf 
from datetime import datetime 
dim = 7000 

Первый пример, когда я просто начать постоянный тензор случайных чисел запуска примерно в то же время irrespectibly тусклых (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. Я нашел, был это объясняется в documentation:

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

101

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

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

ОЧЕНЬ Важно, что вы используете a из a = tf.print во что-то еще! tf.print (a, [a]) ничего не сделает. –

+1

Мы можем просто использовать 'a.eval()' then! –

17

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

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

Just FYI: 'WARNING: tensorflow: From : 1: initialize_all_variables (from tensorflow.python.ops.variables) устарел и будет удален после 2017-03-02. Инструкции по обновлению: Вместо этого используйте 'tf.global_variables_initializer'. –

6

На основании приведенных выше ответов, с вашей фрагменте кода вы можете распечатать продукт, как это:

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

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

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

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

  1. тензоров
  2. Операции
  3. Сеансы
  4. Графы

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

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

Таким образом, вы можете увидеть, что вам не хватает:

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

Надеется, что это помогает!

2

Обратите внимание: 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 
4

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

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

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

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])) 
2

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

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

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

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

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