Mas*_*iff 2 deep-learning keras semantic-segmentation
我有一个任务,输入图像500x500x1
并得到500x500x1
二进制分割。500x500
工作时,只应触发一小部分(小“目标”)。我在输出处使用 sigmoid 激活。由于希望如此小的分数为正,因此训练往往会因所有输出为零或非常接近而停止。我已经编写了自己的损失函数来部分处理它,但如果可能的话,我想使用带有类权重的二元交叉熵。
我的问题分为两部分:
如果我天真地将binary_crossentropy
损失应用于我的500x500x1
输出,它会根据需要应用于每个像素吗?
keras 有没有办法通过每个像素的单个 sigmoid 输出来应用类权重?
回答您的问题。
是的,binary_cross_entropy
将基于每个像素工作,前提是您将形式提供给图像分割神经网络对(500x500x1 图像(灰度图像)+ 500x500x1
(图像的相应掩模))。
通过输入参数 ' class_weight
' 参数model.fit()
假设您有 2 个类别,分布率为 90%-10%。然后,当算法在代表性较差的类(本例中为 10% 的类)犯错误时,您可能需要对算法进行 9 倍的惩罚。假设您有 900 个 1 类示例和 100 个 2 类示例。
然后你的类权重字典(有多种方法来计算它,重要的是为代表性较差的类分配更大的权重),
class_weights = {0:1000/900,1:1000/100}
Run Code Online (Sandbox Code Playgroud)
例子 :model.fit(X_train, Y_train, epochs = 30, batch_size=32, class_weight=class_weight)
注意:这仅适用于 2d 案例(class_weight)。对于 3D 或更高维度的空间,应该使用“sample_weights”。出于分段目的,您宁愿使用sample_weights
参数。
binary_crossentropy
和之外categorical_crossentropy
,其他损失本质上在不平衡数据集上表现更好。Dice Loss
就是这样一个损失函数。喀拉拉邦实施:
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 1 - dice_coef(y_true, y_pred)
Run Code Online (Sandbox Code Playgroud)
binary_crossentropy
如果适合您,您还可以使用 和其他损失之和作为损失函数:即loss = dice_loss + bce
归档时间: |
|
查看次数: |
6402 次 |
最近记录: |