Keras自定义功能:实施Jaccard

时间:2018-03-14 17:43:13

标签: tensorflow keras

我正在尝试将Jaccard系数应用为Keras LSTM中的自定义损失函数,使用Tensorflow作为后端。

我知道我必须拨打以下电话:

model.compile(optimizer='rmsprop', loss=[jaccard_similarity])

其中jaccard_similarity函数应该是以下的keras.backend实现:

def jaccard_similarity(doc1, doc2):
   intersection =set(doc1).intersection(set(doc2))
   union = set(doc1).union(set(doc2))
   return len(intersection)/len(union)

问题是我找不到使用tensorflow作为后端在张量上实现交集和并集函数的方法。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

小心Artur's回答!

intersection = K.sum(K.abs(y_true * y_pred), axis=-1)
sum_ = K.sum(K.abs(y_true) + K.abs(y_pred), axis=-1)

链接中的丢失功能不正确! | X |表示集合的基数,而不是绝对值!求和也是通过类来进行的?

更正的版本应如下所示:( tensorflow版本,尚未测试)

def jaccard_distance(y_true, y_pred, smooth=100):
    """ Calculates mean of Jaccard distance as a loss function """
    intersection = tf.reduce_sum(y_true * y_pred, axis=(1,2))
    sum_ = tf.reduce_sum(y_true + y_pred, axis=(1,2))
    jac = (intersection + smooth) / (sum_ - intersection + smooth)
    jd =  (1 - jac) * smooth
    return tf.reduce_mean(jd)

输入是形状的图像张量(批次,宽度,高度,类)。 计算每个批次和类的jaccard距离(shape =(batch,classes))并将平均值作为损失标量返回。

答案 1 :(得分:3)

我使用了jaccard距离来训练keras中的语义分割网络。我使用的损失函数与this one相同。我将它贴在这里:

from keras import backend as K
def jaccard_distance(y_true, y_pred, smooth=100):
    intersection = K.sum(K.abs(y_true * y_pred), axis=-1)
    sum_ = K.sum(K.abs(y_true) + K.abs(y_pred), axis=-1)
    jac = (intersection + smooth) / (sum_ - intersection + smooth)
    return (1 - jac) * smooth

请注意,这一个减去了jaccard的相似性(你想要最大化)。实际上,它是jaccard距离的连续近似,因此它的导数很明确。

答案 2 :(得分:0)

如我所见,TF v1.6文档中有一个GameObject.Find()。可能这可能会有所帮助。它包含一些计算集合交集,差异和联合的函数。

不确定它何时被引入,以及是否有可能“破解”Keras模型使用具有这些功能的自定义指标。