Как напечатать значение тензора внутри tf. while_loop, не возвращая его? - PullRequest
0 голосов
/ 28 октября 2018

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

Метод 1 (работает):

TF поддерживает опцию печати тензоров при оценке моделивведя на график операцию tf.Print, но для этого требуется, чтобы тензор был возвращен из тела:

import tensorflow as tf
import numpy as np

x = tf.placeholder(tf.float32, [1])

def body(x):
    a = tf.constant( np.array([2]) , dtype=tf.float32)
    x = a + x
    x = tf.Print(x,[x], summarize=100) <= print here (works)
    return x

def condition(x):
    return tf.reduce_sum(x) < 10

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    result = tf.while_loop(cond=condition, body=body, loop_vars=[x])
    result_out = sess.run([result], feed_dict={ x : np.zeros(1)})
    print(result_out)

Out:

[2]
[4]
[6]
[8] 
[10]
[array([10.], dtype=float32)] 

Метод 2 (работает):

TF поддерживает опцию печати тензоров без создания вычислительного графа в режиме Eager.Тот же пример ниже:

import tensorflow as tf
import numpy as np

tf.enable_eager_execution()

def body(x):
    a = tf.constant(np.array([2]), dtype=tf.int32)
    x = a + x
    print(x) <= print here (works)
    return x

def cond(x):
    return tf.reduce_sum(x) < 10 # sum over an axis

x = tf.constant(0, shape=[1])

#result = tf.while_loop(cond=condition, body=body, loop_vars=(x,0))
result=tf.while_loop(cond, body, [x])
print(result)

Out:

tf.Tensor([2], shape=(1,), dtype=int32)
tf.Tensor([4], shape=(1,), dtype=int32)
tf.Tensor([6], shape=(1,), dtype=int32)
tf.Tensor([8], shape=(1,), dtype=int32)

tf.Tensor([10], shape=(1,), dtype=int32)
tf.Tensor([10], shape=(1,), dtype=int32) 

Метод 3 (сбой):

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

import tensorflow as tf
import numpy as np

tfe = tf.contrib.eager

x = tf.placeholder(tf.int32, [1])

def my_py_func(x):
  print(x)  # It's eager!

def body(x):
    a = tf.constant( np.array([2]) , dtype=tf.int32)
    x = a + x
    tfe.py_func(my_py_func, x, tf.int32) <= print here (does not work)
    return x

def condition(x):
    return tf.reduce_sum(x) < 10

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    result = tf.while_loop(condition, body, [x])
    result_out = sess.run([result], feed_dict={ x : np.zeros(1)} )
    print(result_out)

Out:

TypeError: Expected list for 'input' argument to 'EagerPyFunc' Op, not Tensor("while/add:0", shape=(1,), dtype=int32).

Конечно, в этом примере я возвращаю тензор x из тела, но я хочу печатать внутри цикла!

1 Ответ

0 голосов
/ 29 октября 2018

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

x = tf.Print(x, [a])

В этом случае tf.Print - это операция идентификации с побочным эффектом печати значения тензора a при оценке.

...