如何在Keras中将输出掩盖为“不可用/不训练”?

时间:2018-09-10 14:53:57

标签: python tensorflow keras

假设我有一个网络,应该学习两个不同的任务,例如识别图像是否包含猫,狗或两者。假设我们只有一些标签。因此,对于某些图像,我们知道有一只猫,对于某些图像,我们知道没有猫,对于某些图像,我们知道有一只狗,对于某些图像,我们知道没有一只狗。然后标签看起来像这样(狗第一,猫第二):

[[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时不尝试学习?

1 个答案:

答案 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"')]

注意:未测试。