我无法在Keras中创建自定义损失函数。
在我们的模型中,最后一层(y_pred
)的大小为[32,365],将其视为接下来365个时间帧的量化速率。
我想制作一个自定义损失函数,其中包括交叉熵和RMSE。因此,该操作需要1)对y_pred
进行额外的预处理以生成[32,1]大小的logit来计算具有二进制标签(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]
答案 0 :(得分:1)
一种选择是在模型本身中执行操作。这样,您将拥有一个具有两个输出的模型,并且可以对每个输出分别应用损失函数,并具有各自的标签和损失权重:
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], ...)