TF1 имел sess.run()
и .eval()
для получения значений тензоров - а Keras имел K.get_value()
; теперь ни один из них не работает одинаково (бывшие два вообще).
K.eager(K.get_value)(tensor)
, похоже, работает внутри графа Keras, выходя из него, и K.get_value(tensor)
вне графа - оба с нетерпением по умолчанию для TF2 (который раньше был выключен). Однако это не удается, если tensor
является внутренней операцией Keras:
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 ‹2.0. Github промолчал. Мне известны способы переписать код в качестве обходного пути, но это устранит нейтралитет Кераса в отношении серверной части и будет работать аналогично
tf.keras
. Есть ли способ получить значения тензора Keras 2.3 в TensorFlow 2.0, сохранив при этом нейтральность к серверной части?