Keras自定义功能:实现Jaccard

Mau*_*ile 1 keras tensorflow

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

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

model.compile(optimizer='rmsprop', loss=[jaccard_similarity])
Run Code Online (Sandbox Code Playgroud)

其中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)
Run Code Online (Sandbox Code Playgroud)

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

有什么建议吗?

JBW*_*WKy 6

小心Artur的答案!

intersection = K.sum(K.abs(y_true * y_pred), axis=-1)
sum_ = K.sum(K.abs(y_true) + K.abs(y_pred), axis=-1)
Run Code Online (Sandbox Code Playgroud)

链接中的丢失功能不正确!| 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)
Run Code Online (Sandbox Code Playgroud)

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


Art*_*rda 5

我已经使用 jaccard 距离在 keras 中训练语义分割网络。我使用的损失函数与此相同。我把它贴在这里:

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
Run Code Online (Sandbox Code Playgroud)

请注意,这个减去 jaccard 相似度(您想要最大化)。事实上,它是 jaccard 距离的连续近似,因此它的导数是明确定义的。