tensorflow表示用于二进制语义分割的前景类的iou

tensorflow表示用于二进制语义分割的前景类的iou,tensorflow,keras,image-segmentation,Tensorflow,Keras,Image Segmentation,tensorflow.metrics.mean_iou()当前平均每个类的iou。我想得到的iou的唯一前景在我的二进制语义分割问题 我尝试使用weights作为tf.常量([0.0,1.0])但是tf.常量([0.01,0.99])但是平均iou看起来仍然溢出,如下所示: (500102410241) 119/5000[……]-预计到达时间:4536s-损失:0.3897-平均借据:-789716217654962048.0000-附件:0.9335 我将其用作kerasfit\u生成器的m

tensorflow.metrics.mean_iou()
当前平均每个类的
iou
。我想得到的
iou
的唯一前景在我的二进制语义分割问题

我尝试使用
weights
作为
tf.常量([0.0,1.0])
但是
tf.常量([0.01,0.99])
但是
平均iou
看起来仍然溢出,如下所示:

(500102410241)
119/5000[……]-预计到达时间:4536s-损失:0.3897-平均借据:-789716217654962048.0000-附件:0.9335
我将其用作keras
fit\u生成器的
metrics
,如下所示:

def mean_iou(y_true,y_pred):
y_pred=tf.to_int32(y_pred>0.5)
分数,up_opt=tf.metrics.mean_iou(y_true,y_pred,2,权重=tf.constant([0.01,0.99]))
keras.get\u session().run(tf.local\u variables\u initializer())
使用tf.control_依赖项([up_opt]):
分数=tf.身份(分数)
回击得分
我将非常感谢您的帮助,因为我已经尝试了很多东西,甚至自己只使用
keras.backend
函数计算损失,但没有任何东西看起来是正确的。

如果您使用keras 将keras.backend作为K导入

def switch_mean_iou(labels, predictions):
    """
    labels,prediction with shape of [batch,height,width,class_number=2]
    """
    mean_iou = K.variable(0.0)
    seen_classes = K.variable(0.0)

    for c in range(2):
        labels_c = K.cast(K.equal(labels, c), K.floatx())
        pred_c = K.cast(K.equal(predictions, c), K.floatx())

        labels_c_sum = K.sum(labels_c)
        pred_c_sum = K.sum(pred_c)

        intersect = K.sum(labels_c*pred_c)
        union = labels_c_sum + pred_c_sum - intersect
        iou = intersect / union
        condition = K.equal(union, 0)
        mean_iou = K.switch(condition,
                            mean_iou,
                            mean_iou+iou)
        seen_classes = K.switch(condition,
                                seen_classes,
                                seen_classes+1)

    mean_iou = K.switch(K.equal(seen_classes, 0),
                        mean_iou,
                        mean_iou/seen_classes)
    return mean_iou

seen_类也可以固定为class_number=2。