gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:43:44 26 4
gpt4 key购买 nike

我在 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], ...)

关于python - 是否可以通过 y_pred 的额外预处理来制作自定义损失函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55434128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com