4

我有一个用于语义分割的网络,我的模型的最后一层应用了 sigmoid 激活,因此所有预测都在 0-1 之间缩放。有这个验证指标 tf.keras.metrics.MeanIoU(num_classes),它将分类预测(0 或 1)与验证(0 或 1)进行比较。因此,如果我进行预测并应用此指标,它会自动将连续预测映射到阈值 = 0.5 的二进制吗?是否有可能手动定义阈值?

4

2 回答 2

5

不,tf.keras.metrics.MeanIoU不会自动将连续预测映射到阈值 = 0.5 的二进制。

它将连续预测转换为其二进制,方法是将小数点前的二进制数字作为预测,如0.99as 00.50as 00.01as 01.99as 11.01as1等 when num_classes=2因此,基本上如果您的预测值介于0to1和之间num_classes=2,那么0除非预测是 ,否则会考虑所有内容1

以下是证明中行为合理的实验tensorflow version 2.2.0

所有二进制结果:

import tensorflow as tf

m = tf.keras.metrics.MeanIoU(num_classes=2)
_ = m.update_state([0, 0, 1, 1], [0, 0, 1, 1])
m.result().numpy()

输出 -

1.0

将一个预测更改为连续 0.99 -这里它认为0.990

import tensorflow as tf

m = tf.keras.metrics.MeanIoU(num_classes=2)
_ = m.update_state([0, 0, 1, 1], [0, 0, 1, 0.99])
m.result().numpy()

输出 -

0.5833334

将一个预测更改为连续 0.01 -这里它认为0.010

import tensorflow as tf

m = tf.keras.metrics.MeanIoU(num_classes=2)
_ = m.update_state([0, 0, 1, 1], [0, 0.01, 1, 1])
m.result().numpy()

输出 -

1.0

将一个预测更改为连续 1.99 -这里它认为1.991

%tensorflow_version 2.x
import tensorflow as tf

m = tf.keras.metrics.MeanIoU(num_classes=2)
_ = m.update_state([0, 0, 1, 1], [0, 0, 1, 1.99])
m.result().numpy()

输出 -

1.0

所以理想的方法是在评估MeanIoU.

希望这能回答你的问题。快乐学习。

于 2020-06-05T04:33:13.140 回答
0

试试这个(记得用制表符替换空格):

def mean_iou(y_true, y_pred):
    th = 0.5
    y_pred_ = tf.to_int32(y_pred > th)
    score, up_opt = tf.metrics.mean_iou(y_true, y_pred_, 2)
    K.get_session().run(tf.local_variables_initializer())
    with tf.control_dependencies([up_opt]):
        score = tf.identity(score)
    return score
于 2020-06-01T02:53:43.673 回答