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

时间:2019-03-30 17:47:20

标签: python tensorflow machine-learning keras loss-function

我无法在Keras中创建自定义损失函数。

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

我想制作一个自定义损失函数,其中包括交叉熵和RMSE。因此,该操作需要1)对y_pred进行额外的预处理以生成[32,1]大小的logit来计算具有二进制标签(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]

1 个答案:

答案 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], ...)