我正在keras中实现自定义丢失功能。模型的输出是10维softmax层。计算损失:首先我需要找到y触发1的索引,然后用真值减去该值。我正在做以下事情:
nil
但它给出错误“引发ValueError(”不支持None值。“) ValueError:不支持任何值。“ 这有什么问题?
答案 0 :(得分: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'激活在类之间不均匀分布。有些课程比其他课程更有可能。但是因为限制是重要的,所以最初看起来最好的想法。
仅当您的类遵循逻辑递增序列时,此操作才有效。 (我猜他们会这样做,否则你不会尝试那种损失,对吗?)