Validation tf.keras.metrics.MeanIoU带S形层

Validation tf.keras.metrics.MeanIoU带S形层,validation,binary,tf.keras,sigmoid,keras-metrics,Validation,Binary,Tf.keras,Sigmoid,Keras Metrics,我有一个用于语义分割的网络,模型的最后一层应用了sigmoid激活,因此所有预测都在0-1之间缩放。有一个验证度量tf.keras.metrics.MeanIoU(num_类),它将分类预测(0或1)与验证(0或1)进行比较。因此,如果我做一个预测并应用这个度量,它会自动将连续预测映射到阈值为0.5的二进制吗?是否有可能手动定义阈值 试试这个(记住用tab替换空格): 否,tf.keras.metrics.MeanIoU不会自动将连续预测映射到阈值为0.5的二进制 它将连续预测转换为二进制,将小

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

试试这个(记住用tab替换空格):


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

它将连续预测转换为二进制,将小数点前的二进制数字作为预测,如
0.99
as
0
0.50
as
0
0.01
as
0
1.99
as
1
1.01
as
1
etc当
num_classes=2
因此,基本上,如果预测值介于
0
1
num_classes=2
之间,则一切都被视为
0
,除非预测值为
1

以下是验证tensorflow 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
1.0
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()
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()
输出-

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, 1, 0.99])
m.result().numpy()
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.0
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
1.0
1.0
所以理想的方法是定义一个函数,在计算
MeanIoU


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

@willembone-希望我们已经回答了您的问题。如果你对答案感到满意,请接受并投票。