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

Keras中具有附加动态参数的自定义自适应损失函数,keras,loss-function,Keras,Loss Function,我必须使用一个自适应自定义损失函数,该函数在keras中接受一个额外的动态参数(eps)。参数eps是一个标量,但从一个样本到另一个样本发生变化:因此,应在训练期间调整损失函数。我使用一个生成器,我可以在培训期间通过生成器的每次调用传递此参数(generator\u train[2])。根据对类似问题的回答,我试着写以下内容: def custom_loss(eps): def square_err(y_true, y_pred): nom = K.sum(K.squar

我必须使用一个自适应自定义损失函数,该函数在keras中接受一个额外的动态参数(
eps
)。参数
eps
是一个标量,但从一个样本到另一个样本发生变化:因此,应在训练期间调整损失函数。我使用一个生成器,我可以在培训期间通过生成器的每次调用传递此参数(
generator\u 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/(eps**2)

您的生成器应该只输出
x,y,sample\u权重
,仅此而已

您的损失可能是:

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

fit
中,您不能在生成器中使用索引,您将只通过
generator\u train
,不通过
x
,不通过
y
,只通过
generator\u train

非常感谢Daniel的回答。为了确保我能很好地理解您的意思:我是否应该指出我想要传递样本重量的任何位置?它总是按此顺序获取x、y和样本权重?@Basilique,是的,生成器按此顺序输出x、y和样本权重。