Il semble y avoir déjà plusieurs discussions/problèmes à ce sujet, mais il ne me semble pas que cela ait été résolu:
Comment puis-je utiliser la fonction métrique tensorflow dans les modèles keras?
https://github.com/fchollet/keras/issues/605
https://github.com/fchollet/keras/issues/32
Les gens semblent rencontrer des problèmes autour de l'initialisation des variables ou de la métrique 0.
J'ai besoin de calculer différentes métriques de segmentation et je voudrais inclure tf.metric.mean_io dans mon modèle Keras. C'est le meilleur que j'ai pu trouver jusqu'à présent:
def mean_iou(y_true, y_pred):
score, up_opt = tf.metrics.mean_iou(y_true, y_pred, NUM_CLASSES)
K.get_session().run(tf.local_variables_initializer())
return score
model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=[mean_iou])
Ce code ne renvoie aucune erreur mais mean_iou renvoie toujours 0. Je pense que c'est parce que up_opt n'est pas évalué. J'ai vu qu'avant TF 1.3 les gens ont suggéré d'utiliser quelque chose comme control_flow_ops.with_dependencies ([up_opt], score) pour y parvenir. Cela ne semble plus possible dans TF 1.3.
En résumé, comment puis-je évaluer les métriques TF 1.3 dans Keras 2.0.6? Cela semble être une caractéristique assez importante.
vous pouvez toujours utilisercontrol_dependencies
def mean_iou(y_true, y_pred):
score, up_opt = tf.metrics.mean_iou(y_true, y_pred, NUM_CLASSES)
K.get_session().run(tf.local_variables_initializer())
with tf.control_dependencies([up_opt]):
score = tf.identity(score)
return score
Il y avait 2 clés pour que cela fonctionne pour moi. Le premier utilisait
sess = tf.Session()
sess.run(tf.local_variables_initializer())
Pour initialiser les variables TF après avoir utilisé les fonctions TF (et compilé), mais avant de faire model.fit()
. Vous avez cela dans votre exemple initial, mais la plupart des autres exemples montrent tf.global_variables_initializer()
, ce qui n'a pas fonctionné pour moi.
L'autre chose que j'ai découverte est l'objet op_update, qui est renvoyé en tant que deuxième partie du tuple à partir de nombreuses métriques TF, c'est ce que nous voulons. L'autre partie semble être 0 lorsque les métriques TF sont utilisées avec Keras. Ainsi, votre métrique IOU devrait ressembler à:
def mean_iou(y_true, y_pred):
return tf.metrics.mean_iou(y_true, y_pred, NUM_CLASSES)[1]
from keras import backend as K
K.get_session().run(tf.local_variables_initializer())
model.fit(...)