我正在尝试将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作为后端在张量上实现交集和并集函数的方法。
有什么建议吗?
答案 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模型使用具有这些功能的自定义指标。