Keras 损失函数:如何舍入?

Keras loss functions: how to round?

我正在尝试识别序列中的转折点,在这些转折点之后某些过程的行为会有所不同。我使用 keras 模型来执行此操作。输入是序列(总是相同的长度),输出应该在转折点之前为 0,在转折点之后为 1。

我希望损失函数取决于实际转折点和预测转折点之间的距离。

我尝试四舍五入(获取标签0或1),然后将1的总数求和得到转折点的"index"。这里假设模型只给出一个转折点,因为数据(合成生成的)也只有一个转折点。试过的是:

def dist_loss(yTrue,yPred):
    turningPointTrue = K.sum(yTrue) 
    turningPointPred = K.sum(K.round(yPred))
    return K.abs(turningPointTrue-turningPointPred)

这个不行,报错如下:

ValueError: An operation has None for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

我认为这意味着 K.round(yPred) 给出了一个奇异值,而不是 vector/tensor。有谁知道如何解决这个问题?

round操作没有定义的梯度,所以它根本不能在损失函数中使用,因为对于神经网络的训练,必须计算损失相对于权重的梯度,这意味着网络的所有部分和损失都必须是可微的(或者可微近似必须可用)。

在你的情况下,你应该尝试找到一个可微分的近似值,但不幸的是我不知道是否存在。这种近似的一个例子是 softmax 函数作为 max 函数的近似。