假设我有一个网络,应该学习两个不同的任务,例如识别图像是否包含猫,狗或两者。假设我们只有一些标签。因此,对于某些图像,我们知道有一只猫,对于某些图像,我们知道没有猫,对于某些图像,我们知道有一只狗,对于某些图像,我们知道没有一只狗。然后标签看起来像这样(狗第一,猫第二):
[[None, 1]. [None, 0], [None, 0], [1, None], ...]
含义
当然,这些标签可以很容易地分为两部分:
[[-1, 1]. [-1, 0], [-1, 0], [1, -1], ...]
[[1, 0]. [1, 0], [1, 0], [0, 1], ...]
-在进行梯度计算时应忽略的部分。我该如何掩盖这些标签的渐变,以便在出现None
时不尝试学习?
答案 0 :(得分:0)
让我们假设mask
是形状为(batch_size, 2)
的张量,并且如果mask[i, j]
的第j
标签为i
,则import keras.backend as K
def custom_loss(mask):
# Mask: tensor with shape=(None, 2)
def loss(y_true, y_pred):
return K.mean(mask * K.binary_crossentropy(y_true, y_pred))
return loss
为0示例未定义,否则为1。然后,要掩盖渐变,可以如下定义损失函数:
//content[contains(text(), '"Learn more"')]
注意:未测试。