自定义损失函数,用于预测交互输出?

时间:2020-02-16 13:31:41

标签: python tensorflow machine-learning deep-learning

我目前正在研究必须预测整数输出的数据集。它从1到N开始。我已经建立了具有损耗功能mse的​​网络。但是我觉得在整数输出的情况下,mse损失函数可能不是将其最小化的理想损失函数。

我也在舍弃我的预测以获得整数输出。在整数输出的情况下,有没有一种方法可以使模型更好地进行/优化。

任何人都可以提供有关如何处理整数输出/目标的帮助。这是我现在正在使用的损失函数。

model.compile(optimizer=SGD(0.001), loss='mse')

2 个答案:

答案 0 :(得分:1)

您使用了错误的损失,均方误差是回归损失,并且存在分类问题(离散的输出,不是连续的)。

为此,您的模型应该具有softmax输出层:

model.add(Dense(N, activation="softmax"))

您应该使用分类损失:

model.compile(optimizer=SGD(0.001), loss='sparse_categorical_crossentropy')

假设您的标签是[0, N-1]范围内的整数(相差一),则应该可以使用。要做出预测,您应该执行以下操作:

output = np.argmax(model.predict(some_data), axis=1) + 1

+1是因为整数标签从0N-1

答案 1 :(得分:1)

Ordinal regression可能是一种合适的方法,以防预测错误的月份但接近真实的月份比预测一年或之后的值更小的错误。根据您要解决的特定问题,只有您知道这一点。

我找到了适当的损失函数on github的实现(无隶属关系)。为了完整起见,下面我将粘贴该仓库中的代码:

from keras import backend as K
from keras import losses

def loss(y_true, y_pred):
    weights = K.cast(
        K.abs(K.argmax(y_true, axis=1) - K.argmax(y_pred, axis=1))/(K.int_shape(y_pred)[1] - 1),
        dtype='float32'
    )
    return (1.0 + weights) * losses.categorical_crossentropy(y_true, y_pred)