在keras中创建自定义损失函数,从数据集中输入特征

2024-03-28 20:50:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为Keras深度学习回归模型创建一个自定义损失函数。对于自定义损失函数,我希望使用数据集中的一个功能,但我不使用该特定功能作为模型的输入

我的数据如下所示:

X  |  Y  | feature
---|-----|--------
x1 | y1  | f1
x2 | y2  | f2

模型的输入是X,我想用模型预测Y。我希望损失函数如下所示:

def custom_loss(feature):
    def loss(y_true, y_pred):
        root_mean__square(y_true - y_pred) + std(y_pred - feature)
    return loss

我不能像上面那样使用包装器函数,因为特性值取决于训练和测试批次,因此不能在模型编译时传递给自定义损失函数。如何使用数据集中的附加功能创建自定义损耗函数

编辑:

我根据对this thread的回答做了以下工作。当我使用此模型进行预测时,它是对“Y”进行预测还是对Y和附加功能的组合进行预测?我想确定一下,因为model.fit()将“Y”和“feature”都作为Y进行训练,但是model.predict()只给出一个输出。如果预测是Y和附加特征的组合,如何仅提取Y

    def custom_loss(data, y_pred):

        y_true = data[:, 0]
        feature = data[:, 1]
        return K.mean(K.square((y_pred - y_true) + K.std(y__pred - feature)))

    def create_model():
        # create model
        model = Sequential()
        model.add(Dense(5, input_dim=1, activation="relu"))
        model.add(Dense(1, activation="linear"))

    (train, test) = train_test_split(df, test_size=0.3, random_state=42)

    model = models.create_model(train["X"].shape[1])
    opt = Adam(learning_rate=1e-2, decay=1e-3/200)
    model.compile(loss=custom_loss, optimizer=opt)


    model.fit(train["X"], train[["Y", "feature"]], validation_data=(test["X"], test[["Y", "feature"]]), batch_size = 8, epochs=90)

    predY = model.predict(test["X"]) # what does the model predict here?

Tags: 数据函数模型test功能truedatamodel
1条回答
网友
1楼 · 发布于 2024-03-28 20:50:15

首先在fit函数中检查输入Y的数据结构,看看它是否与您所遵循的线程中的答案具有相同的结构,如果您做的事情完全正确,那么它应该解决您的问题

当我使用此模型进行预测时,它是对“Y”进行预测还是对Y和附加功能的组合进行预测?

该模型将具有与您定义的完全相同的输出形状,在您的示例中,因为模型输出为Dense(1, activation="linear"),所以它具有输出形状y_pred.shape == (batchsize, 1),除此之外,您可以确定,使用tf.print(y_pred)打印出来自己查看

另外,我不知道是否是您的键入错误,自定义丢失函数的最后一行应该是:

return K.mean(K.square((y_pred - y_true) + K.std(y_pred - feature)))

而不是

return K.mean(K.square((y_pred - y_true) + K.std(y__pred - feature)))

相关问题 更多 >