我希望我的keras网络能预测60..200范围内的数字输出。以我的经验,在这种情况下,仅输出Sigmoid * 140 + 60或类似的性能非常差,将其转换为类会更好。
但是,我正在努力定义损失函数。显然预测附近的一堂课更好,应该少受处罚。
下面的示例代码。网络显然会更加复杂,并且可能会部分卷积,但这只是开始。
当前代码给出一个错误:“ IndexError:只有整数,切片(:
),省略号(...
),numpy.newaxis('None')和整数或布尔数组才是有效索引”。我想这是有道理的,因为反向传播限制了可以做的事情,但是我不确定如何正确设计和调试损失函数。
classes = np.array(range(60,200,5))
nc = classes.shape[0]
def myloss(y_true, y_pred):
pred_class = K.argmax(y_pred,axis=1)
return K.sqrt( K.sum( K.square( classes[pred_class] - y_true ) ) )
in1 = Input(shape=(77,))
mid = Dense(50, activation='tanh')( in1 )
out = Dense(nc, activation='softmax')( mid )
model = Model(inputs=in1, outputs=out)
model.add_loss( myloss(sbp, out) )
答案 0 :(得分:1)
您描述的问题是序数回归问题。关于机器学习中的序数回归的损失函数有很多论文。如您所说,其想法是对更大的偏差进行更多的惩罚,而在通常用于分类的交叉熵损失中却不是这种情况。您可以看一下这个github仓库(我自己没有使用过它的经验):https://github.com/JHart96/keras_ordinal_categorical_crossentropy