tensorflow 自定义均值IoU度量以训练U-Net模型

nhaq1z21  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(170)

我试图构建一个自定义的均值IoU度量,用于训练U-Net模型来分类四个分类的[0,1,2,3]数据集,但我得到了一个错误。
我的代码:

#Calculating mean IoU metric

from keras.metrics import MeanIoU
from keras import backend as K
n_classes = 4

def mean_IoU_metric(y_true, y_pred):

    y_pred_argmax = K.argmax(y_true, axis=3) 
    IOU_keras = MeanIoU(num_classes=n_classes)  
    IOU_keras.update_state(y_true[:,:,:,0], y_pred_argmax)
    IOU_keras = tf.convert_to_tensor(IOU_keras, np.float32)

    return IOU_keras

错误:

TypeError: Expected float32, but got MeanIoU(name=mean_io_u,dtype=float32,num_classes=4) of type 'MeanIoU'.

请你帮我解决这个问题,非常感谢。

osh3o9ms

osh3o9ms1#

如果你想在TensorFlow中训练模型期间和之后使用meanIoU(多个样本的平均IoU)作为度量,你可以遵循下面提供的解决方案。
1.创建从tf.keras.metrics.MeanIoU继承的自定义指标类

import tensorflow as tf

class CustomMeanIoU(tf.keras.metrics.MeanIoU):
    """
    Source: https://github.com/tensorflow/tensorflow/issues/32875#issuecomment-707316950
    """
    def __init__(self, num_classes=None, name=None, dtype=None):
        super(CustomMeanIoU, self).__init__(
            num_classes=num_classes, name=name, dtype=dtype
        )

    def update_state(self, y_true, y_pred, sample_weight=None):
        y_true = tf.math.argmax(y_true, axis=-1)
        y_pred = tf.math.argmax(y_pred, axis=-1)
        return super().update_state(y_true, y_pred, sample_weight)

1.若要在模型训练期间使用此度量,请执行以下操作:

custom_mIoU_metric = CustomMeanIoU(num_classes=4, name='mIoU')

model.compile(
    ...,
    metrics=[custom_mIoU_metric]
)

根据您的项目,可能需要进行一些修改。你可以在我的个人项目中找到一个例子:https://github.com/MortenTabaka/Semantic-segmentation-of-LandCover.ai-dataset/blob/main/src/features/metrics.py

相关问题