Los objetos de tensor no son iterables cuando la ejecución ávida no está habilitada. Para iterar sobre este tensor use `tf.map_fn`

Estoy tratando de crear mi propia función de pérdida:

def custom_mse(y_true, y_pred): tmp = 10000000000 a = list(itertools.permutations(y_pred)) for i in range(0, len(a)): t = K.mean(K.square(a[i] - y_true), axis=-1) if t < tmp : tmp = t return tmp 

Debería crear permutaciones del vector predicho y devolver la pérdida más pequeña.

  "`Tensor` objects are not iterable when eager execution is not " TypeError: `Tensor` objects are not iterable when eager execution is not enabled. To iterate over this tensor use `tf.map_fn`. 

error. No encuentro ninguna fuente para este error. ¿Por qué está pasando esto?

Gracias por hel

El error está ocurriendo porque y_pred es un tensor (no iterable sin una ejecución impaciente), e itertools.permutations espera que sea posible crear las permutaciones. Además, la parte en la que calcula la pérdida mínima tampoco funcionaría, porque los valores del tensor t son desconocidos en el momento de la creación del gráfico.

En lugar de permutar el tensor, crearía permutaciones de los índices (esto es algo que puede hacer en el momento de la creación del gráfico) y luego recostackría los índices permutados del tensor. Suponiendo que su backend Keras es TensorFlow y que y_true / y_pred son bidimensionales, su función de pérdida podría implementarse de la siguiente manera:

 def custom_mse(y_true, y_pred): batch_size, n_elems = y_pred.get_shape() idxs = list(itertools.permutations(range(n_elems))) permutations = tf.gather(y_pred, idxs, axis=-1) # Shape=(batch_size, n_permutations, n_elems) mse = K.square(permutations - y_true[:, None, :]) # Shape=(batch_size, n_permutations, n_elems) mean_mse = K.mean(mse, axis=-1) # Shape=(batch_size, n_permutations) min_mse = K.min(mean_mse, axis=-1) # Shape=(batch_size,) return min_mse