【问题标题】:Custom loss function implementation issue in keraskeras 中的自定义损失函数实现问题
【发布时间】:2018-05-25 13:31:41
【问题描述】:

我正在 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:不支持任何值。” 这里有什么问题?

【问题讨论】:

    标签: python tensorflow deep-learning keras loss-function


    【解决方案1】:

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

    如果您想要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”激活在类之间没有均匀分布。有些课程比其他课程更有可能。但既然有一个限制很重要,那么一开始这似乎是最好的主意。

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

    【讨论】:

    • 那么有什么解决办法呢?我希望损失是指数的差异!
    • 不可能....我会在答案中建议一种非常不同的方法供您尝试....
    猜你喜欢
    • 2018-03-18
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2021-10-25
    • 2020-12-19
    • 2017-12-18
    相关资源
    最近更新 更多