これにはすでにいくつかのスレッド/問題があるようですが、これは解決されたように見えません:
ケラスモデル内でテンソルフローメトリック関数をどのように使用できますか?
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メトリックをどのように評価しますか?これは非常に重要な機能のようです。
あなたはまだ使うことができます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
これを機能させるための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(...)
_