我正在尝试识别顺序中的转折点,在这些转折点之后,某些过程的行为会有所不同。我使用keras模型来做到这一点。输入是序列(总是相同的长度),输出应该在转折点之前为0,在转折点之后为1。
我希望损失函数取决于实际转折点与预测转折点之间的距离。
我尝试四舍五入(获得标签0或1),然后求和1的总数,以得出转折点的“索引”。这里假设模型只给出一个转折点,因为数据(综合生成)也只有一个转折点。尝试过的是:
def dist_loss(yTrue,yPred):
turningPointTrue = K.sum(yTrue)
turningPointPred = K.sum(K.round(yPred))
return K.abs(turningPointTrue-turningPointPred)
这不起作用,给出以下错误:
ValueError:操作具有
None
用于渐变。请确定 您所有的操作都定义了渐变(即 可区分的)。不带渐变的常见操作:K.argmax,K.round, 埃瓦尔。
我认为这意味着K.round(yPred)给出奇异值,而不是矢量/张量。有人知道如何解决这个问题吗?
答案 0 :(得分:3)
round
操作没有定义的梯度,因此完全不能在损失函数中使用,因为对于神经网络的训练,必须计算损失相对于权重的梯度,并且这意味着网络的所有部分和损耗必须是可微的(或者必须有可微的近似)。
在您的情况下,您应该尝试找到可微分的近似值,但是不幸的是,我不知道是否有一个近似值。这种近似的一个例子是softmax函数,即max函数的近似。