【发布时间】:2018-07-14 18:40:30
【问题描述】:
我正在尝试使用如下定义的自定义损失函数进行对象分割:
def chamfer_loss_value(y_true, y_pred):
# flatten the batch
y_true_f = K.batch_flatten(y_true)
y_pred_f = K.batch_flatten(y_pred)
# ==========
# get chamfer distance sum
// error here
y_pred_mask_f = K.cast(K.greater_equal(y_pred_f,0.5), dtype='float32')
finalChamferDistanceSum = K.sum(y_pred_mask_f * y_true_f, axis=1, keepdims=True)
return K.mean(finalChamferDistanceSum)
def chamfer_loss(y_true, y_pred):
return chamfer_loss_value(y_true, y_pred)
y_pred_f 是我的 U-net 的结果。 y_true_f 是对 ground truth 标签掩码 x 进行欧几里得距离变换的结果,如下所示:
distTrans = ndimage.distance_transform_edt(1 - x)
要计算倒角距离,您需要将预测图像(理想情况下是具有 1 和 0 的掩码)乘以地面实况距离变换,然后简单地对所有像素求和。为此,我需要通过对y_pred_f 进行阈值处理来获得一个蒙版y_pred_mask_f,然后乘以y_true_f,并对所有像素求和。
y_pred_f 在 [0,1] 中提供连续范围的值,我在评估 y_true_mask_f 时收到错误 None type not supported。我知道损失函数必须是可微的,greater_equal 和 cast 不是。但是,有没有办法在 Keras 中规避这个问题?也许在 Tensorflow 中使用一些解决方法?
【问题讨论】:
-
它是不可微的,但是如果你使用梯度下降,你需要梯度来优化。你有手动定义的渐变吗?如果是这样,您可以手动计算梯度并将其放入。请参阅此处stackoverflow.com/questions/43839431/…
标签: tensorflow machine-learning neural-network deep-learning keras