不,tf.keras.metrics.MeanIoU 不会自动将连续预测映射到阈值 = 0.5 的二进制。
它将连续预测转换为二进制,通过将小数点前的二进制数字作为预测,如0.99 为0,0.50 为0,0.01 为0,@987654328 @ 作为1,1.01 作为1 等num_classes=2。 所以基本上如果你的预测值在0 到1 和num_classes=2 之间,那么除非预测是1,否则一切都被认为是0。
以下是证明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之前定义一个函数将连续转换为二进制。
希望这能回答您的问题。快乐学习。