web-dev-qa-db-ja.com

KerasでTensorFlowメトリックを使用する方法

これにはすでにいくつかのスレッド/問題があるようですが、これは解決されたように見えません:

ケラスモデル内でテンソルフローメトリック関数をどのように使用できますか?

https://github.com/fchollet/keras/issues/605

https://github.com/fchollet/keras/issues/32

変数の初期化またはメトリックが0の周りで問題が発生するようです。

さまざまなセグメンテーションメトリックを計算する必要があり、Kerasモデルに tf.metric.mean_io を含めたいです。これは私がこれまでに思いついた中で最高です。

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])

このコードはエラーをスローしませんが、mean_iouは常に0を返します。これは、up_optが評価されないためと考えられます。私はTF 1.3より前に 人々が提案したcontrol_flow_ops.with_dependencies([up_opt]、score)これを達成するため。これはTF 1.3ではもう可能ではないようです。

要約すると、Keras 2.0.6でTF 1.3メトリックをどのように評価しますか?これは非常に重要な機能のようです。

11
davhab

あなたはまだ使うことができますcontrol_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

これを機能させるための2つの鍵がありました。最初は使用していた

_sess = tf.Session()
sess.run(tf.local_variables_initializer())
_

TF関数を使用(およびコンパイル)した後、model.fit()を実行する前にTF変数を初期化します。最初の例ではそれがわかりますが、他のほとんどの例はtf.global_variables_initializer()を示していますが、これは私には機能しませんでした。

私が発見したもう1つのことは、多くのTFメトリックからタプルの2番目の部分として返されるop_updateオブジェクトです。 TFメトリックがKerasで使用される場合、他の部分は0のようです。したがって、IOUメトリックは次のようになります。

_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