Для тензорного потока <2.0 Графический режим по умолчанию. Чтобы запустить в активном режиме, вы должны включить его в начале с помощью: </p>
import tensorflow as tf #<--- first import
tf.enable_eager_execution() #<-- immidiately followed by this, before you start defining any model
.
.
.
...rest of the code
Eager-tenors have. numpy () function.
Но даже если вы сделаете это, метод tf.keras.Model.fit () может его где-то отключить. Потому что:
Это работает:
def test(self, y_true, y_pred):
if tf.executing_eagerly(): #<--- This is False
print(y_true.numpy())
else:
print(y_pred)
Это также:
def test(self, y_true, y_pred):
print(y_pred)
Но это не так:
def test(self, y_true, y_pred):
tf.print(y_true)
print(y_true.numpy())
Если вы хотите сделайте любые дальнейшие вычисления для y_true, затем вы можете сделать это, используя тензор потока операций в графическом режиме:
class custom_metric(Metric):
def __init__(self, name = 'custom_metrics', **kwargs):
super(custom_metric, self).__init__(name = name, **kwargs)
self.true_positives = self.add_weight(name = 'tp', initializer = 'zeros')
self.lol_value = self.add_weight(name = 'lol', initializer = 'zeros')
def update_state(self, y_true, y_pred, sample_weight = None):
self.test(y_true, y_pred)
# In a real application, new_metric would be a function that depends on
# the values stored in both y_true and y_pred
new_metric = 0.1
self.true_positives.assign_add(tf.reduce_sum(new_metric))
def result(self):
return self.lol_value
def reset_states(self):
self.true_positives.assign(0.)
self.lol_value.assign(0.)
def test(self, y_true, y_pred):
print(y_pred)
self.lol_value.assign_add(100)
или, если вы действительно, абсолютно хотите numpy, тогда используйте tf.numpy_function () , который преобразует обычные вычисления numpy в эквивалентный графовый код.
def func_x(varx):
#print(x)
return (varx+1).astype(np.uint8)
class custom_metric(Metric):
def __init__(self, name = 'custom_metrics', **kwargs):
super(custom_metric, self).__init__(name = name, **kwargs)
self.true_positives = self.add_weight(name = 'tp', initializer = 'zeros')
self.res = self.add_weight(name='loop_counter', initializer='zeros', dtype=tf.uint8)
def update_state(self, y_true, y_pred, sample_weight = None):
self.test(y_true, y_pred)
# In a real application, new_metric would be a function that depends on
# the values stored in both y_true and y_pred
new_metric = 0.1
self.true_positives.assign_add(tf.reduce_sum(new_metric))
def result(self):
return self.res
def reset_states(self):
self.true_positives.assign(0.)
def test(self, y_true, y_pred):
self.res.assign(tf.numpy_function(func=func_x, inp=[self.res], Tout=[tf.uint8]))