Невозможно получить хорошие результаты при попытке предсказать среднее и стандартное отклонение в задаче регрессии изображения - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь регрессировать две переменные (mean и std), а затем пытаюсь оптимизировать log (gaussian_distribution) = log (std) + (target - mean) / (2 * std ^ 2).

Обратите внимание, что на тех же данных, если изменить потерю (или даже просто использовать (цель - среднее) ^ 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)

Я реализовал это в Керасе , Некоторые похожие блоги (https://engineering.taboola.com/predicting-probability-distributions/)

1 Ответ

2 голосов
/ 25 февраля 2020

Я реализовал эту потерю, ваша реализация была моей первой попыткой, и, как вы говорите, она просто не работает. Я не уверен, почему, но вот правильный способ реализовать эту потерю:

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_loss API, но я не пробовал .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...