Как вывести значение тензорного объекта в TensorFlow?



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



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


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

1204   13  

13 ответов:

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

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

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


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

[B]: Вы может будет возможность использовать экспериментальные 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)

теперь, когда мы оцениваем весь график, например, с помощью b.eval(), мы получить:

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

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

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

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

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

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

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


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

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. Я нашел это объясняется в документация:

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

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

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

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

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

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

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

надеюсь, что это помогает!

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

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

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

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

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

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

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

init = tf.global_variables_initializer()

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

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

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

print(sess.run([product]))

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

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

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

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

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

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

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

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)

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

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

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

with tf.Session() as sess:
    sess.run(c)
    c.eval()

выход будет

2018-08-01 14:41:00.397653: I tensorflow / core / common_runtime/gpu/gpu_device. cc:1471] добавление видимых устройств gpu: 0
2018-08-01 14:41: 00.397738: I tensorflow/core/common_runtime/gpu/gpu_device. cc: 952] устройство межсоединения StreamExecutor с прочностью 1 ребра матрицы:
2018-08-01 14: 41: 00.397759: I tensorflow / core / common_runtime / gpu/gpu_device. cc:958] 0
2018-08-01 14: 41: 00.397776: I tensorflow / core / common_runtime / gpu/gpu_device. cc:971] 0: N
2018-08-01 14:41:00.398018: я tensorflow/основных/common_runtime/ОГПУ/gpu_device.чч:1084] создано TensorFlow устройства (/работа:localhost в/реплика:0/задач:0/устройству:графический процессор:с 0 2752 МБ памяти) -> физический процессор (прибор: 0, имя: флагманская модель 1050 ти шину PCI код: 0000:01:00.0, вычислительные способности: 6.1)
массив([[1., 2., 3.], [4., 5., 6.]], dtype=float32)
массив([[1., 2., 3.], [4., 5., 6.]], dtype=float32)

мы получаем массив, напечатанный дважды, поскольку сеанс имеет только постоянные проходы тензора, а также у нас есть c.eval()

Comments

    Ничего не найдено.