代码之家  ›  专栏  ›  技术社区  ›  Vaaal88

Tensorflow/Keras自定义损失函数

  •  1
  • Vaaal88  · 技术社区  · 6 年前

    我想在keras中创建一个自定义损失函数。

    假设我有yTrue和yPred,它们是真标签和预测标签的张量(nx m)。

    让我们将每个示例n(即,yTrue和yPred中的每一行)称为yT和yP。 然后我想要一个损失函数,当yT[0]=1时计算(yT yP)^2,否则它将计算(yT[0]-yP[0])^2。

    也就是说:对于每个样本,我总是想计算第一个元素的平方误差——但我只想在真标签的第一个元素=1时计算其他元素的平方误差。

    如何在自定义损失函数中执行此操作?

    到目前为止,我得到的是:

    我需要做张量运算。 首先我可以计算

    Y = (yTrue - yPred)^2
    

    然后我可以定义一个屏蔽矩阵,其中第一列始终为一,其他列为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 
    

    然后我可以将这个矩阵按元素乘以Y,得到我想要的结果。

    但是,如何生成掩蔽矩阵?特别是,如何在tensorflow/keras中实现“如果行的第一个元素为1”的条件?

    也许有更好的方法? 谢谢

    1 回复  |  直到 6 年前
        1
  •  3
  •   nuric    6 年前

    可以使用条件开关 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)
    

    编辑以根据样本条件进行处理。