Reputation: 19836
TF1 had sess.run()
and .eval()
to get values of tensors - and Keras had K.get_value()
; now, neither work the same (former two at all).
K.eager(K.get_value)(tensor)
appears to work inside Keras graph by exiting it, and K.get_value(tensor)
outside the graph - both w/ TF2's default eagerly (which is off in former). However, this fails if tensor
is a Keras backend operation:
import keras.backend as K
def tensor_info(x):
print(x)
print("Type: %s" % type(x))
try:
x_value = K.get_value(x)
except:
try: x_value = K.eager(K.get_value)(x)
except: x_value = x.numpy()
print("Value: %s" % x_value) # three methods
ones = K.ones(1)
ones_sqrt = K.sqrt(ones)
tensor_info(ones); print()
tensor_info(ones_sqrt)
<tf.Variable 'Variable:0' shape=(1,) dtype=float32, numpy=array([1.], dtype=float32)>
Type: <class 'tensorflow.python.ops.resource_variable_ops.ResourceVariable'>
Value: [1.]
Tensor("Sqrt:0", shape=(1,), dtype=float32)
Type: <class 'tensorflow.python.framework.ops.Tensor'>
# third print fails w/ below
AttributeError: 'Tensor' object has no attribute 'numpy'
tf.keras
. Is there a way to get Keras 2.3 tensor values in TensorFlow 2.0 while retaining backend-neutrality?
Upvotes: 10
Views: 27136
Reputation: 55
In my case tensorflow 2.0 this works when printing the loss:
import tensorflow as tf
from tensorflow import keras
...
print(loss_value)
print(float(loss_value) )
output:
tf.Tensor(2.3782592, shape=(), dtype=float32)
2.3782591819763184
Upvotes: 0
Reputation: 696
I think what you are looking for is tf.keras.backend.get_value
API.
print(x)
>>tf.Tensor([1.], shape=(1,), dtype=float32)
print(tf.keras.backend.get_value(x))
>>[1.]
Upvotes: 1
Reputation: 19836
Per my PR, this is the more reliable (but not guaranteed) workaround:
def K_eval(x):
try:
return K.get_value(K.to_dense(x))
except:
eval_fn = K.function([], [x])
return eval_fn([])[0]
Update: mind the distrubution context under which a Tensor
is to be evaluated; in TF2.2, a tf.Variable
or tf.Tensor
created under tf.python.distribute.distribution_strategy_context.in_replica_context() == True
will fail any K.eval
-etc attempts. Looks like tensors simply aren't meant to be evaluated there.
Upvotes: 1
Reputation: 2679
I think you want K.eval
:
>>> v = K.ones(1)
>>> K.eval(v)
array([1.], dtype=float32)
>>> K.eval(K.sqrt(v))
array([1.], dtype=float32)
Note that K.get_value
is reserved for use with variables (e.g. v
here) while K.eval
works with any tensor.
Upvotes: 9