我正在尝试使用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作为后端在张量上实现交集和并集函数的方法。
有什么建议吗?
小心Artur的答案!
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
输入是形状(批量,宽度,高度,类别)的图像张量。计算每个批次和类别(形状=(批次,类别))的jaccard距离,并返回平均值作为损失标量。
我已经使用 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 距离的连续近似,因此它的导数是明确定义的。
| 归档时间: |
|
| 查看次数: |
2310 次 |
| 最近记录: |