我在尝试使用以下自定义损失函数和指标在keras
中训练一个用于图像分割的UNet模型:
def dice_coef(y_true, y_pred):
'''
参数: y_true -- 对应RGB图像的标记掩码
y_pred -- RGB图像的预测掩码
返回: dice_coeff -- 一个在0到1之间衡量精确度和召回率的指标。越接近1越好。
引用(MIT许可证): https://github.com/jocicmarko/
ultrasound-nerve-segmentation/blob/
master/train.py
'''
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
smooth = 1.0
return (2.0*intersection+smooth)/(K.sum(y_true_f)+K.sum(y_pred_f)+smooth)
def dice_coef_loss(y_true, y_pred):
'''
参数: y_true -- 对应RGB图像的标记掩码
y_pred -- RGB图像的预测掩码
返回: 1 - dice_coeff -- dice系数的否定,在0到1之间。越接近0越好。
引用(MIT许可证): https://github.com/jocicmarko/
ultrasound-nerve-segmentation/blob/
master/train.py
'''
return 1-dice_coef(y_true, y_pred)
当在RAM中加载一部分图像进行训练时,一切正常。然而,当使用flow_from_directory
和fit_generator
从整个数据集逐步加载图像批次时,我得到了负损失和大于1的dice系数。以下是生成器的代码:
回答:
感谢@今天的见解,我意识到图像和掩码都被加载为值范围从0到255的数组。所以我添加了一个预处理函数来对它们进行归一化,这解决了我的问题:
image_datagen = ImageDataGenerator(preprocessing_function=lambda x: x/255)
mask_datagen = ImageDataGenerator(preprocessing_function=lambda x: x/255)