我有一个任务,其中输入500x500x1
图像并获得500x500x1
二进制分割。工作时,仅应触发500x500
的一小部分(小的“目标”)。我在输出中使用了S型激活。由于希望如此小的分数是正数,因此训练倾向于使所有输出为零或非常接近时停顿。我已经编写了自己的损失函数来部分处理它,但是如果可能的话,我想使用带有类加权的二进制交叉熵。
我的问题分为两个部分:
如果我天真地将binary_crossentropy
用作损失500x500x1
的输出,是否可以根据需要将其应用于每个像素?
keras是否有一种方法可以对每个像素使用单个S形输出来应用类加权?
答案 0 :(得分:1)
回答您的问题。
1)是的,只要您将图像分割神经网络对的格式为(500x500x1图像(灰度图像)+ 500x500x1(与图像对应的蒙版),就可以对binary_cross_entropy进行逐像素处理。
2)通过在model.fit()中输入参数'class_weight'
假设您有2个班级,其分布率为90%-10%。然后,如果对表示较少的类(在这种情况下为10%的类)犯错,则可能要对算法处以9倍以上的罚款。假设您有900个类别1的示例和100个类别2的示例。
然后,您的班级权重字典(有多种计算方法,重要的是为代表较少的班级分配更大的权重),class_weights = {0:1000 / 900,1:1000/100} < / p>
示例:model.fit(X_train, Y_train, epochs = 30, batch_size=32, class_weight=class_weight)
注意:仅在2d情况下(class_weight)可用。对于3D或更高维度的空间,应使用“ sample_weights”。
3)除binary_cross_entropy和categorical_cross_entropy外,其他指标在不平衡数据集上固有地表现更好。 Dice_Metric就是这样的指标。
Keras实现:
smooth = 1.
def dice_coef(y_true, y_pred):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
def dice_coef_loss(y_true, y_pred):
return -dice_coef(y_true, y_pred)