【问题标题】:Use generator in loss function在损失函数中使用生成器
【发布时间】:2018-05-13 08:16:41
【问题描述】:

我需要将其他信息合并到取决于当前批次的 Keras 损失函数中。由于 Keras 损失只需要两个参数,因此我考虑通过在生成器对象上调用损失函数 next() 来添加此信息。但是,生成器只被调用一次(可能是在 model.compile() 中添加损失函数时)。 这是一个示例代码:

data_batches = yield_data_batches()
meta_batches = yield_meta_batches()
....
model.compile(loss=loss_function, ...)
model.fit_generator(generator=data_batches, ....)

def loss_function(x, y):
      meta_x, meta_y = next(meta_batches)
      x *= meta_x  # component-wise matrix multiplication
      y *= meta_y  # component-wise matrix multiplication
      return mse(x, y)

有没有办法让损失函数在每次对 data_batch 进行评估时获得一个新的 meta_batch?或者有没有其他方法可以将这些元信息合并到损失函数中?

澄清: meta_x 和 meta_y 是二进制矩阵,应该从预测中消除某些元素,因为它们不应该计入损失。 例如:

y_true = (a,b,c,0) y_pred = (d,e,f,g) y_meta = (1,1,1,0)

现在,y_pred*y_meta 应该取消 g,这样它就不会计入损失。

【问题讨论】:

    标签: python neural-network keras loss-function


    【解决方案1】:

    这不起作用,因为损失函数将被编译并添加到计算图中。你的损失函数可能只依赖于y_predy_true

    您可以将此信息合并到 y_true 中,或使用样本权重对由此产生的损失进行加权。

    您的方法相当于两者的结合: 假设权重 a 和 b(你称它们为 meta_x 和 meta_y): |斧头| = a|x-b/a*y|,所以你只需用 b/a 加权 y_pred 并加上样本权重 a。

    【讨论】:

    • 在我的例子中,权重不是标量而是矩阵。它应该是一个按分量的矩阵乘法(我在上面的例子中解决了这个问题)。因此,不幸的是,您的方法不起作用。如果我将此信息合并到 y_true 中(即连接这两个矩阵),则神经网络必须估计更多参数。这也不是一个可行的解决方案。
    猜你喜欢
    • 2018-12-20
    • 2018-07-26
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2018-07-28
    相关资源
    最近更新 更多