Keras 中带有附加动态参数的自定义自适应损失函数

时间:2021-05-06 09:51:55

标签: keras loss-function

我必须使用自适应自定义损失函数,该函数在 keras 中采用额外的动态参数 (eps)。参数 eps 是一个标量,但从一个样本变为另一个:因此应该在训练期间调整损失函数。我使用生成器,并且可以在训练期间通过生成器的每次调用传递此参数 (generator_train[2])。基于对类似问题的回答,我尝试编写以下包装:

def custom_loss(eps):
    def square_err(y_true, y_pred):
        nom = K.sum(K.square(y_pred - y_true), axis=-1)
        denom = eps**2
        loss = nom/denom
        return loss
    return square_err

但我正在努力实现它,因为 eps 是一个动态变量:我不知道我应该如何在训练期间将此参数传递给损失函数 (model.fit)。这是我的模型的一个简单版本:

model = keras.Sequential()
model.add(layers.LSTM(units=32, input_shape=(32, 4))
model.add(layers.Dense(units=1))
model.add_loss(custom_loss)
opt = keras.optimizers.Adam()
model.compile(optimizer=opt)
history = model.fit(x=generator_train[0], y=generator_train[1],
                    steps_per_epoch=100
                    epochs=50,
                    validation_data=gen_vl,
                    validation_steps=n_vl)

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

只需传递“样本权重”,每个样本的权重为 1/(eps**2)

您的生成器应该只输出 x, y, sample_weights,仅此而已。

您的损失可能是:

def loss(y_true, y_pred):
    return K.sum(K.square(y_pred - y_true), axis=-1)

fit中,你不能在生成器中使用索引,你只会传递generator_train,没有x,没有y,只有generator_train。< /p>