Python keras中的自定义损失函数实现问题
我正在keras中实现一个自定义损失函数。该模型的输出为10维softmax层。要计算损失:首先我需要找到y的指数1,然后用真值减去该值。我正在做以下工作: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
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”激活在类之间分布不均匀。某些类别的可能性比其他类别更大。但是,既然有一个限度很重要,那么一开始这似乎是最好的主意
只有当类遵循逻辑递增顺序时,这才有效。(我想他们会的,否则你就不会尝试那种损失,对吧?那么解决这个问题的办法是什么?我希望损失是指数的差值!不可能。。。。我将在答案中建议一种非常不同的方法,供您尝试。。。。