【问题标题】:Custom adaptive loss function with additional dynamic argument in KerasKeras 中带有附加动态参数的自定义自适应损失函数
【发布时间】:2021-07-28 15:07:20
【问题描述】:

我必须在 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)

非常感谢您的帮助。

【问题讨论】:

    标签: keras loss-function


    【解决方案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

    【讨论】:

    • 非常感谢丹尼尔的回答。只是为了确保我能很好地理解你:我是否应该指出我想通过 sample_weights 的任何地方?它总是按这个顺序取 x、y 和 sample_weights ?
    • @Basilique,是的,生成器按这个顺序输出x、y、sample_weights。
    猜你喜欢
    • 2018-10-11
    • 2018-08-26
    • 2020-10-05
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    • 2018-10-28
    • 2017-12-29
    相关资源
    最近更新 更多