是否可以通过 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_true
和 y_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], ...)
我在 Keras 中制作自定义损失函数时遇到问题。
在我们的模型中,最后一层 (y_pred
) 的大小是 [32, 365],这被视为接下来 365 个时间帧的量化率。
我想制作一个自定义损失函数,其中包括交叉熵和 RMSE。因此,这些操作需要 1) y_pred
的额外预处理以生成 [32, 1] 大小的 logits 以使用二进制标签 (y_true)
计算交叉熵,以及 2) y_pred
的另一个预处理生成额外的 [32, 1] 值以使用数字标签计算 RMSE。
据我所知,y_true
和 y_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], ...)