是否可以通过 y_pred 的额外预处理来制作自定义损失函数?

Is it possible to make a custom loss function with additional preprocessing of y_pred?

我在 Keras 中制作自定义损失函数时遇到问题。

在我们的模型中,最后一层 (y_pred) 的大小是 [32, 365],这被视为接下来 365 个时间帧的量化率。

我想制作一个自定义损失函数,其中包括交叉熵和 RMSE。因此,这些操作需要 1) y_pred 的额外预处理以生成 [32, 1] 大小的 logits 以使用二进制标签 (y_true) 计算交叉熵,以及 2) y_pred 的另一个预处理生成额外的 [32, 1] 值以使用数字标签计算 RMSE。

据我所知,y_truey_pred 在 Keras 自定义损失函数中应该具有相同的维度。但就我而言,y_pred 的大小是 [32, 365]。是将 y_true 的维度设为 [32, 365] 还是在计算两次损失之前将上述预处理步骤添加到 Keras 模型中?

我之前的方案是这样自定义损失函数的,现在怀疑y_true的维度是[32, 2]。如果维度是 [32, 365] 数据值是多少???

def losses(y_true, y_pred):
    a = 0.2
    loss1 = rmse_loss(y_true, preprocess1(y_pred))
    loss2 = ce_loss(y_true,  preprocess2(y_pred))
    loss = 0.2*loss1 + 0.8*loss2
    return loss

附加信息: train_generator 的输出是一个大小为 [32, 10], [32, 2] 的元组,其中 32 是小批量大小,10 是协变量的数量,2 是标签的数量(二进制,数字)

train_data = self.train_data_generator()
ntd = next(train_data)
print(ntd[0].shape, ntd[1].shape)
>>> [32, 10], [32, 2]

一种替代方法是在模型本身中执行操作。这样,您将拥有一个具有两个输出的模型,您可以分别对每个输出应用损失函数,并使用它们自己的标签和损失权重:

from keras.layers import Lambda

# the model definition goes here...

out1 = Lambda(preprocess1)(final_out) # you can also implement this using existing layers
out2 = Lambda(preprocess2)(final_out)

model = Model(inp, [out1, out2])

model.compile(loss=[rmse_loss, ce_loss], loss_weights=[0.2, 0.8], ...)