【问题标题】:How can I mask outputs as "not-available / don't train" in Keras?如何在 Keras 中将输出屏蔽为“不可用/不训练”?
【发布时间】:2019-02-15 01:08:12
【问题描述】:

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

[[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

【问题讨论】:

  • 如果把“没有猫”改成“这不是猫”,会不会对学习有很大的影响 --> 所以把None改成0 比如?
  • 是的,我很确定。假设有一只猫。甚至可能在 60% 的情况下。然后你告诉网络 60% 的案例是错误的信息。

标签: python tensorflow keras


【解决方案1】:

假设mask 是一个形状为(batch_size, 2) 的张量,如果i-th 示例的j-th 标签未定义,则mask[i, j] 为0,否则为1。然后,为了掩盖梯度,您可以如下定义损失函数:

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

注意:未经测试。

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 2019-04-29
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多