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?
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.
Thank you; however, only works with
import keras.backend as K
- fails fortensorflow.keras.backend
andtensorflow.python.keras.backend
. As other functionality may depend on latter two, this isn't a complete answer. It may, however, be a bug - can you confirm?I've checked the snippet with the imports you've listed, and all three produce the same result. Could you update your question with the outputs you get in each of these cases?
All's good - turns out
tf.python
isn't meant to be used anyway (see here), or not always.