Як надрукувати значення об'єкта Tensor в TensorFlow?


258

Я використовував вступний приклад множення матриць у 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?

Відповіді:


250

Найпростіший [A] спосіб оцінити фактичне значення Tensorоб'єкта - це передати його Session.run()методу або зателефонувати, Tensor.eval()коли у вас сеанс за замовчуванням (тобто в with tf.Session():блоці або див. Нижче). Загалом [B] , ви не можете надрукувати значення тензора, не запустивши якийсь код у сеансі.

Якщо ви експериментуєте з моделлю програмування і хочете простий спосіб оцінити тензори, tf.InteractiveSessionви можете відкрити сеанс на початку програми, а потім використовувати цей сеанс для всіх Tensor.eval()Operation.run()) дзвінків. Це може бути простішим в інтерактивних умовах, таких як оболонка або ноутбук IPython, коли нудно проходити навколо Sessionоб'єкта скрізь. Наприклад, наступні роботи в зошиті Юпітера:

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

Це може здатися нерозумним для такого невеликого вираження, але однією з ключових ідей у ​​Tensorflow 1.x є відкладене виконання : побудувати великий і складний вираз дуже дешево, і коли ви хочете його оцінити, бек-енд (для який ви з'єднуєте з a Session) здатний запланувати ефективніше його виконання (наприклад, виконання незалежних частин паралельно та використання графічних процесорів).


[A]: Щоб надрукувати значення тензора, не повертаючи його програмі Python, ви можете використовувати tf.print()оператор, як пропонує Анджей в іншій відповіді . Відповідно до офіційної документації:

Щоб переконатися, що оператор працює, користувачам потрібно передати створений операційний tf.compat.v1.Sessionметод методу run або використовувати оп як контрольну залежність для виконаних операцій, вказавши з tf.compat.v1.control_dependencies([print_op]), який друкується на стандартний вихід.

Також зауважте, що:

У зошитах Юпітера та співавторах tf.printдрукується до виходів комірок ноутбука. Він не запише в журнали консолі ядра ноутбука.

[B]: Ви могли б бути в змозі використати tf.get_static_value()функцію , щоб отримати постійне значення даного тензора , якщо його значення ефективно обчислюється.


17
Отримати деякі атрибути Тенора можна, не викликаючи Session.run (). Наприклад, ви можете зателефонувати tensor.get_shape (). У багатьох випадках це дає достатню інформацію для налагодження.
Ian Goodfellow

5
Дивіться також відповідь And про tf.Print op нижче. Я продовжую знаходити цю відповідь stackoverflow під час googling для "tensorflow print", і ця відповідь дає можливість звучати так, ніби немає tf.Print op.
Ian Goodfellow

2
Я додав у відповідь кілька застережень, тож тепер має бути зрозуміліше. (Я не думаю, що оригінальний запитувач цікавився набуттям форми тензора, просто значення.)
mrry

1
Чи є спосіб збереження у файл замість друку на консолі (через tf.Print)?
thang

tf.Session()не працює в Tensorflow 2. Ви можете використовувати це tf.compat.v1.Session()замість цього.
мікрофон

158

Хоча інші відповіді правильні, що ви не можете роздрукувати значення, поки не оціните графік, вони не говорять про один простий спосіб фактично надрукувати значення всередині графіка, як тільки ви його оціните.

Найпростіший спосіб побачити значення тензора щоразу, коли графік оцінюється (використовуючи 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]

37
ДУЖЕ важливо, що ви використовуєте a з a = tf.print для чогось іншого! tf.print (a, [a]) нічого іншого не зробить
Fábio Dias

5
Ми можемо просто використовувати a.eval()!
Удайрай Дешмух

1
@FabioDias Я не думаю, що я зрозумів вашу думку? Не могли б ви, будь ласка, детально
розібратися,

7
Зверніть увагу, що tf.Print()його було знято та (зараз) видалено. Замість використання tf.print(). Див. Документи: tensorflow.org/api_docs/python/tf/Print та tensorflow.org/api_docs/python/tf/print .
Гефест

1
Уау, я просто здивований, побачивши власний коментар через рік @yuqli, але тепер я розумію його суть. Дивіться цю публікацію, яка все ще стосується застарілого API, але ідеї, ймовірно, схожі.
yuqli

27

Повторюючи те, що сказали інші, неможливо перевірити значення, не запустивши графік.

Простий фрагмент для тих, хто шукає простий приклад друку значень, наведений нижче. Код можна виконати без будь-яких змін у ноутбуці 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
Тільки FYI:WARNING:tensorflow:From <ipython-input-25-8583e1c5b3d6>:1: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. Instructions for updating: Use 'tf.global_variables_initializer' instead.
Марк Креймер

20

Ні, ви не можете побачити вміст тензора, не запустивши графік (робити 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 - це символьна ручка до результату операції, але насправді не містить значень результатів операції.


15

Я думаю, вам потрібно правильно визначити деякі основи. Наведеними вище прикладами ви створили тензори (багатовимірний масив). Але щоб тензорний потік справді працював, вам потрібно ініціювати " сеанс " і запустити " операцію " в сеансі. Зауважте слова "сесія" та "операція". Для роботи з tensorflow вам потрібно знати 4 речі:

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

Тепер, з написаного вами, ви дали тензор і операцію, але у вас немає сеансу запуску і не графік. Тензор (краї графіки) протікають через графіки і маніпулюють операціями (вузлами графіка). Графік за замовчуванням є, але ви можете ініціювати своє в сеансі.

Коли ви говорите друк, ви отримуєте доступ лише до форми визначеної змінної або константи.

Тож ви можете побачити, чого вам не вистачає:

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

Сподіваюся, це допомагає!


12

В Tensorflow 1.x

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.x режим охочих увімкнено за замовчуванням. тому наступний код працює з 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.]]

1
Я встановив TensorFlow версії 1.13.2 і включив нетерпляче виконання (перевіряється, якщо працює з tf.executing_eagerly ()) та отримує помилку 'Tensor' об’єкта не має атрибута 'numpy' при спробі оцінити значення тензора у функції спеціальної втрати. Я дуже вдячний за будь-яку допомогу у вирішенні проблеми.
Ніко Гамулін

1
@NikoGamulin переконайтеся, що ви поставили tf.compat.v1.enable_eager_execution () на початку свого сценарію. У мене версія 1.14.0, я запускаю свій сценарій на PyCharm, і tensor.numpy () працює
Tommaso Di Noto

1
@NikoGamulin ця помилка з’являється лише тоді, коли ви намагаєтесь отримати доступ до тензора в режимі Graph. Я думаю, можливо, нетерпляче виконання не було ввімкнено належним чином. Щоб перевірити прагнення до виконання, просто визначте aa = tf.constant (2.0), b = tf.constant (3.0), print (tf.add (a, b)). Якщо ви бачите відповідь як 5.0, нетерпіння було включено належним чином.
Vishnuvardhan Janapati

9

Виходячи з наведених вище відповідей, за допомогою конкретного фрагмента коду ви можете надрукувати продукт таким чином:

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

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

tf.print(product)а також дає такий же вихід, як print(product.numpy())і для TF 2.0.
HUSMEN

8

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.


7

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


5

Зверніть увагу, що 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

5

Вам слід подумати про програми 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]))

4

Ви можете використовувати Keras, однорядковий відповідь буде використовувати такий evalметод:

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

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)

2

Мені не було легко зрозуміти, що потрібно, навіть прочитавши всі відповіді, поки я цього не виконав. 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()

1

В основному, в tensorflow, коли ви створюєте тензор будь-якого типу, вони створюються і зберігаються всередині них, до яких можна отримати доступ лише під час запуску сеансу tensorflow. Припустимо , ви створили постійний тензор
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
без проведення сеансу, ви можете отримати
- op: Операція. Операція, що обчислює цей тензор.
- value_index: Інт. Індекс кінцевої точки операції, який виробляє цей тензор.
- dtype: DType. Тип елементів, що зберігаються в цьому тензорі.

Для отримання значень можна запустити сеанс з потрібним тензором як:

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

Вихід буде приблизно таким:

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


1

Увімкніть нетерпляче виконання, яке введено в tensorflow після версії 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)

1

Використовуючи поради, надані на 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)

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

0

tf.Print тепер застарілий, ось як використовувати tf.print (малий p) замість цього.

Хоча запуск сеансу - хороший варіант, не завжди це шлях. Наприклад, ви можете надрукувати тензор у певному сеансі.

Новий спосіб друку повертає операцію друку, яка не має вихідних тензорів:

print_op = tf.print(tensor_to_print)

Оскільки у нього немає виходів, ви не можете вставити його у графік так само, як ви могли б із tf.Print. Натомість ви можете додати його для контролю залежностей у своєму сеансі, щоб зробити його друкованим.

sess = tf.compat.v1.Session()
with sess.as_default():
  tensor_to_print = tf.range(10)
  print_op = tf.print(tensor_to_print)
with tf.control_dependencies([print_op]):
  tripled_tensor = tensor_to_print * 3
sess.run(tripled_tensor)

Іноді в більшому графіку, можливо, створеному частково в підфункціях, громіздко поширювати print_op на сеансовий виклик. Потім tf.tuple можна використовувати для з'єднання операції друку з іншою операцією, яка потім буде виконуватися з цією операцією, залежно від того, який сеанс виконує код. Ось як це робиться:

print_op = tf.print(tensor_to_print)
some_tensor_list = tf.tuple([some_tensor], control_inputs=[print_op])
# Use some_tensor_list[0] instead of any_tensor below.

-1

Питання: Як надрукувати значення об'єкта 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.