我有一个用于语义分割的网络,我的模型的最后一层应用了 sigmoid 激活,因此所有预测都在 0-1 之间缩放。有这个验证指标 tf.keras.metrics.MeanIoU(num_classes),它将分类预测(0 或 1)与验证(0 或 1)进行比较。因此,如果我进行预测并应用此指标,它会自动将连续预测映射到阈值 = 0.5 的二进制吗?是否有可能手动定义阈值?
问问题
2690 次
2 回答
5
不,tf.keras.metrics.MeanIoU
不会自动将连续预测映射到阈值 = 0.5 的二进制。
它将连续预测转换为其二进制,方法是将小数点前的二进制数字作为预测,如0.99
as 0
,0.50
as 0
,0.01
as 0
,1.99
as 1
,1.01
as1
等 when num_classes=2
。因此,基本上如果您的预测值介于0
to1
和之间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.99
是0
。
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.01
是0
。
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.99
是1
。
%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 回答