J'essaie de créer ma propre fonction de perte:
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
Cela devrait créer des permutations du vecteur prédit et renvoyer la plus petite perte.
"`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`.
erreur. Je ne parviens pas à trouver une source pour cette erreur. Pourquoi cela arrive-t-il?
Merci pour hel.
L'erreur se produit parce que y_pred
est un tenseur (non itérable sans exécution désirée), et itertools.permutations attend qu’une itérable puisse créer les permutations. De plus, la partie dans laquelle vous calculez la perte minimale ne fonctionnerait pas non plus, car les valeurs de tensor t
sont inconnues au moment de la création du graphique.
Au lieu de permuter le tenseur, je créerais des permutations des indices (c'est ce que vous pouvez faire au moment de la création du graphique), puis je rassemble les indices permutés du tenseur. En supposant que votre backend Keras est TensorFlow et que y_true
/y_pred
sont bidimensionnels, votre fonction de perte pourrait être implémentée comme suit:
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