Как получить значение тензора Кераса в TensorFlow 2?

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, сохранив при этом нейтральность к серверной части?


person OverLordGoldDragon    schedule 06.10.2019    source источник


Ответы (3)


Я думаю, вам нужно K.eval:

>>> v = K.ones(1)
>>> K.eval(v)
array([1.], dtype=float32)
>>> K.eval(K.sqrt(v))
array([1.], dtype=float32)

Обратите внимание, что K.get_value зарезервирован для использования с переменными (например, здесь v), а K.eval работает с любым тензором.

person Sergei Lebedev    schedule 06.10.2019
comment
Спасибо; однако работает только с import keras.backend as K - не работает с tensorflow.keras.backend и tensorflow.python.keras.backend. Поскольку другие функции могут зависеть от двух последних, это не полный ответ. Однако это может быть ошибка - вы можете подтвердить? - person OverLordGoldDragon; 07.10.2019
comment
Я проверил фрагмент с указанным вами импортом, и все три дают одинаковый результат. Не могли бы вы дополнить свой вопрос результатами, полученными в каждом из этих случаев? - person Sergei Lebedev; 07.10.2019
comment
Все в порядке - оказывается, tf.python в любом случае не предназначен для использования (см. здесь) или не всегда. - person OverLordGoldDragon; 08.10.2019

Согласно моему PR, это более надежный (но не гарантированный) обходной путь:

def K_eval(x):
    try:
        return K.get_value(K.to_dense(x))
    except:
        eval_fn = K.function([], [x])
        return eval_fn([])[0]

Обновление: обратите внимание на контекст распространения, в котором должен оцениваться Tensor; в TF2.2, tf.Variable или tf.Tensor, созданные в tf.python.distribute.distribution_strategy_context.in_replica_context() == True, будут терпеть неудачу при любых K.eval-и т. д. попытках. Похоже, что тензоры просто не предназначены для оценки.

person OverLordGoldDragon    schedule 01.02.2020

Я думаю, что вы ищете tf.keras.backend.get_value API.

print(x)
>>tf.Tensor([1.], shape=(1,), dtype=float32)
print(tf.keras.backend.get_value(x))
>>[1.]
person DesiKeki    schedule 29.11.2020