Keras 中带有附加变量输入的自定义损失/目标函数

Posted

技术标签:

【中文标题】Keras 中带有附加变量输入的自定义损失/目标函数【英文标题】:Custom loss/objective function with additional variable input in Keras 【发布时间】:2018-08-26 23:17:48 【问题描述】:

我正在尝试在 Keras(张量流后端)中创建一个自定义目标函数,其中包含一个附加参数,其值取决于正在训练的批次。

例如:

def myLoss(self, stateValues):
    def sparse_loss(y_true, y_pred):
        foo = tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred)
        return tf.reduce_mean(foo * stateValues)
    return sparse_loss


self.model.compile(loss=self.myLoss(stateValue = self.stateValue),
        optimizer=Adam(lr=self.alpha))

我的火车功能如下

for batch in batches:
    self.stateValue = computeStateValueVectorForCurrentBatch(batch)
    model.fit(xVals, yVals, batch_size=<num>)

但是,损失函数中的 stateValue 并没有被更新。它只是使用 stateValue 在 model.compile 步骤中的值。

我想这可以通过将 placeHolder 用于 stateValue 来解决,但我不知道该怎么做。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

您的损失函数没有得到更新,因为 keras 没有在每批之后编译模型,因此没有使用更新的损失函数。

您可以定义一个自定义回调,该回调将在每批之后更新损失值。像这样的:

from keras.callbacks import Callback

class UpdateLoss(Callback):
    def on_batch_end(self, batch, logs=):
        # I am not sure what is the type of the argument you are passing for computing stateValue ??
        stateValue = computeStateValueVectorForCurrentBatch(batch)
        self.model.loss = myLoss(stateValue)

【讨论】:

以上是关于Keras 中带有附加变量输入的自定义损失/目标函数的主要内容,如果未能解决你的问题,请参考以下文章

keras 中带有 train_on_batch 的自定义 Loss fnc 用于重放学习

Keras 中基于输入数据的自定义损失函数

Keras 上的自定义损失函数

使用张量流在 keras 中对损失函数的输入进行切片

Keras 中的自定义损失函数(IoU 损失函数)和梯度误差?

张量流中带有循环的自定义损失