python - 在图像回归任务中尝试预测均值和标准差时无法获得好的结果
问题描述
我试图回归两个变量(均值和标准差),然后尝试优化 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/)
解决方案
我已经实现了这个损失,你的实现是我的第一次尝试,正如你所说,它只是行不通。我不知道为什么,但这是实现这种损失的正确方法:
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 来实现这种损失,但我没有尝试过。
推荐阅读
- c++ - 如何在一个字符上读取和保存数据?(流)
- c++ - 为什么 std::hardware_con/破坏性_interference_size 不同?
- python - 无法使用 conda 卸载 keras
- javascript - Reactjs 在循环中重新渲染组件
- python - 我的 miniconda3 安装(python3.7.1)中缺少 time.thread_time()
- hadoop - 为什么每次重启hive-server都需要重启hue
- c# - 如何使用实体框架在winforms应用程序的连接字符串中实现加密和解密解决方案?
- c++ - 更改 2D 矩阵上的值时出现段错误
- vb.net - 在程序启动时自动打开 xls 文件?
- google-drive-api - Google Drive 上的文件提供 API 错误。需要与旧文件关联的“Drive Realtime API 数据”