首页 > 解决方案 > 在图像回归任务中尝试预测均值和标准差时无法获得好的结果

问题描述

我试图回归两个变量(均值和标准差),然后尝试优化 log(gaussian_distribution) = log(std) + (target - mean) / (2 * std ^ 2)。

请注意,在相同的数据上,如果在第一个变量上将损失更改为(或什至仅在我定义的函数中使用 (target - mean) ^ 2)MSE,我可以获得非常好的均值分数。

我无法找出代码中的错误或找出它不应该工作的原因。

这是代码

 def gaussian_loss(y2, y1):                              
     std = K.exp(y1[:,1])                                                        
     mean = y1[:,0]                                                                                                  
     return K.mean(K.log(std) + K.square(mean - y2[:,0]) / (2 * K.square(std)), axis = -1)

我已经在 Keras 中实现了这一点。一些相关的博客(https://engineering.taboola.com/predicting-probability-distributions/

标签: pythonmachine-learningkerasdeep-learningregression

解决方案


我已经实现了这个损失,你的实现是我的第一次尝试,正如你所说,它只是行不通。我不知道为什么,但这是实现这种损失的正确方法:

def regression_nll_loss(sigma_sq, epsilon = 1e-6):
    def nll_loss(y_true, y_pred):
        return 0.5 * K.mean(K.log(sigma_sq + epsilon) + K.square(y_true - y_pred) / (sigma_sq + epsilon))

    return nll_loss

正如您所看到的,这种损失仅将监督标签作为均值。方差必须作为张量直接传递给损失:

inp = Input(shape=(1,))
x = Dense(10, activation="relu")(inp)
x = Dense(20, activation="relu")(x)
x = Dense(30, activation="relu")(x)
mean = Dense(1, activation="linear")(x)
var = Dense(1, activation="softplus")(x)

train_model = Model(inp, mean)
pred_model = Model(inp, [mean, var])

train_model.compile(loss=regression_nll_loss(var), optimizer="adam")

然后,您可以使用train_model进行正常训练model.fit,并pred_model进行预测。

您可以在以下位置查看使用我的库的完整示例:https ://github.com/mvaldenegro/keras-uncertainty/blob/master/examples/regression_deep-ensemble.py

我认为也可以使用add_lossAPI 来实现这种损失,但我没有尝试过。


推荐阅读