То, что я хочу, это напечатать значение тензора внутри тела 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
из тела, но я хочу печатать внутри цикла!