-1

我正在 keras 中实现自定义损失函数。模型的输出是 10 维的 softmax 层。要计算损失:首先我需要找到 y 触发 1 的索引,然后用真值减去该值。我正在执行以下操作:

from keras import backend as K

def diff_loss(y_true,y_pred):

    # find the indices of neuron firing 1
    true_ind=K.tf.argmax(y_true,axis=0)
    pred_ind=K.tf.argmax(y_pred,axis=0)

    # cast it to float32
    x=K.tf.cast(true_ind,K.tf.float32)
    y=K.tf.cast(pred_ind,K.tf.float32)

    return K.abs(x-y)

但它给出了错误“raise ValueError("None values not supported.") ValueError: None values not supported。” 这里有什么问题?

4

1 回答 1

0

发生这种情况是因为您的函数不可微分。它由常数组成。

如果您想要argmax结果,根本没有解决方案。


一种测试方法

由于您使用的是“softmax”,这意味着只有一个类是正确的(您不能同时拥有两个类)。

而且由于您想要索引差异,也许您可​​以使用单个连续结果(连续值是可微的)。

仅使用从 -0.5 到 9.5 的一个输出,并通过四舍五入的结果来获取类。

这样一来,您就可以让最后一层只有一个单元:

lastLayer = Dense(1,activation = 'sigmoid', ....) #or another kind if it's not dense    

并使用 lambda 层更改范围:

lambdaLayer = Lambda(lambda x: 10*x - 0.5)

现在你的损失可以是一个简单的'mae'(平均绝对误差)。

这种尝试的缺点是“sigmoid”激活在类之间没有均匀分布。有些课程比其他课程更有可能。但是,由于限制很重要,所以起初这似乎是最好的主意。

这仅在您的课程遵循逻辑递增顺序时才有效。(我想他们会这样做,否则你不会尝试那种损失,对吧?)

于 2017-12-12T01:41:17.147 回答