Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python keras中的自定义损失函数实现问题_Python_Tensorflow_Deep Learning_Keras_Loss Function - Fatal编程技术网

Python keras中的自定义损失函数实现问题

Python keras中的自定义损失函数实现问题,python,tensorflow,deep-learning,keras,loss-function,Python,Tensorflow,Deep Learning,Keras,Loss Function,我正在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

我正在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)
但它给出了错误“raisevalueerror”(“不支持任何值”) ValueError:不支持任何值。“
这里有什么问题?

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

如果您希望结果是
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”激活在类之间分布不均匀。某些类别的可能性比其他类别更大。但是,既然有一个限度很重要,那么一开始这似乎是最好的主意


只有当类遵循逻辑递增顺序时,这才有效。(我想他们会的,否则你就不会尝试那种损失,对吧?

那么解决这个问题的办法是什么?我希望损失是指数的差值!不可能。。。。我将在答案中建议一种非常不同的方法,供您尝试。。。。