11

似乎已经有几个线程/问题,但在我看来这并没有解决:

如何在 keras 模型中使用 tensorflow 度量函数?

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

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

人们似乎要么遇到变量初始化问题,要么遇到指标为 0 的问题。

我需要计算不同的细分指标,并希望在我的 Keras 模型中包含tf.metric.mean_iou 。这是迄今为止我能想到的最好的:

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 指标?这似乎是一个非常重要的功能。

4

2 回答 2

11

你仍然可以使用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
于 2017-08-29T19:59:38.333 回答
1

有 2 把钥匙让这对我有用。第一个是使用

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

在使用 TF 函数(和编译)之后,但在执行model.fit(). 您在最初的示例中已经做到了这一点,但大多数其他示例都显示tf.global_variables_initializer(),这对我不起作用。

我发现的另一件事是 op_update 对象,它作为来自许多 TF 度量的元组的第二部分返回,这正是我们想要的。当 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(...)
于 2019-02-21T22:43:29.947 回答