我想在keras中创建自定义丢失函数。
假设我有yTrue和yPred,它们是真实和预测标签的张量(n×m)。
让我们调用每个样本n(即yTrue和yPred中的每一行)yT和yP。 然后我想要一个在yT [0] == 1时计算(yT-yP)^ 2的损失函数,否则它将计算(yT [0] -yP [0])^ 2.
那就是:对于每个样本我总是想要计算第一个元素的平方误差 - 但是我想只计算真实标签的第一个元素== 1时计算其他元素的平方误差。
如何在自定义丢失功能中执行此操作?
这是我到目前为止所得到的:
我需要通过张量操作来做到这一点。 首先,我可以计算
Y = (yTrue - yPred)^2
然后我可以定义一个屏蔽矩阵,其中第一列始终为1,其他列为1,具体取决于yTrue每行的第一个元素的值。 所以我可以得到像
这样的东西1 0 0 0 0
1 0 0 0 0
1 1 1 1 1
1 1 1 1 1
1 0 0 0 0
然后,我可以将这个矩阵与元素相乘,得到我想要的东西。
但是,如何生成掩蔽矩阵?特别是,我如何处理条件"如果行的第一个元素是1"在tensorflow / keras?
也许有更好的方法可以做到这一点? 谢谢
答案 0 :(得分:1)
您可以在后端使用条件开关K.switch
。有点像:
mse = K.mean(K.square(y_pred - y_true), axis=-1) # standard mse
msep = K.square(y_pred[:,0] - y_true[:,0])
return K.switch(K.equals(y_true[:,0], 1), mse, msep)
编辑处理每个样本条件。