web-dev-qa-db-fra.com

Comment utiliser les métriques TensorFlow dans Keras

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.

11
davhab

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
11
Ishant Mrinal

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(...)
1
wordsforthewise