仅在 Keras 功能 API LSTM 中使用额外的 Ground Truth 来实现自定义损失函数

问题描述 投票:0回答:1

我目前有一个使用 Keras Function API 构建的简单 LSTM 模型,该模型采用 X_train 数据集来预测关联的 Y_train 数据。我构建了一个自定义损失函数,可以使用模型生成的 y_pred 和 y_true 值,但是我希望通过引入额外的基本事实(本质上是 y_train_v2)来进一步扩展它,该函数仅用于计算损失(即不使用直接通知 LSTM 训练)。

我已经生成了可以将输入数据带入损失函数的代码(尽管这是不正确的形状),但我正在努力弄清楚如何将这些附加数据引入而不使其成为模型其余部分的一部分并确保Y_train_V2在损失函数中在形状和批次方面与原始Y_train匹配一次(本质上产生y_true和y_true_V2)。下面是我当前的代码,它使用包装器将 LSTM 输入引入损失函数。如前所述,我希望更改此设置,以便从 y_train_V2 获得一个额外的 y_true 值,该值仅在损失函数中使用。

def custom_loss_wrapper(i):
    def custom_loss(y_true, y_pred):
        return K.sqrt(K.mean(K.square(y_pred - y_true)))
    return custom_loss

def baseline_model():
    i = Input(shape = (14,1))
    x = LSTM(64,return_sequences=False)(i)
    o = Dense(1)(x)
    model = keras.Model(i,o)
    print(i.shape)
    model.compile(optimizer='adam', loss=custom_loss_wrapper(i))
    return model

baseline_model().fit(x_train, y_train, epochs=10, batch_size= 4, validation_data=(x_test, y_test))

我已经完成了几个关于类似主题的查询(例如将 LSTM 中使用的输入数据也引入到损失函数中),但我一直在努力将它们应用到我的具体问题上 - 特别是当我不确定如何确保 y_true 和 y_true_2 之间的值在批处理等方面保持一致

对于上述查询中的任何错误或重复,提前致歉,如果有任何疑问,我很乐意进一步详细说明。

我尝试将 y_train_V2 作为模型的另一个输入引入,但我关心的是如何确保它不会在 LSTM 训练中使用,并且仍然被处理,以便与 y_train 是同一批次。

tensorflow keras lstm loss-function
1个回答
0
投票

您可以将它们连接到 y 标签,例如

# random dummy data
x_train = tf.random.uniform((100, 14, 1))
y_train_v1 = tf.random.uniform((100, 1))
y_train_v2 = tf.random.uniform((100, 1))
y_train = tf.concat((y_train_v1, y_train_v2), axis=-1)

def custom_loss_wrapper(i):
    def custom_loss(y_true, y_pred):
        y_true = y_true[:, :1]
        y_true2 = y_true[:, 1:] #  do here what you want with it
        return K.sqrt(K.mean(K.square(y_pred - y_true)))
    return custom_loss

在这里,

y_train
包含您的基本事实以及您的附加信息。请注意,如果您想使用其他指标,则需要一个额外的包装器来处理
y_true
中的两个信息。
另一种方法可能是您的网络有另一个输入和输出,它可以吞吐量此信息。然后您可以为不同的输出指定不同的指标。但这设置起来有点复杂。

© www.soinside.com 2019 - 2024. All rights reserved.