Keras实现:具有不确定性输出的定制损失函数

时间:2019-07-15 12:27:40

标签: python tensorflow keras neural-network

对于回归任务,我想自定义损失函数以另外输出确定性度量。

最初的正常网络为:

model = Sequential()
model.add(Dense(15, input_dim=7, kernel_initializer='normal'))
model.add(Dense(1, kernel_initializer='normal'))
model.compile(loss='mean_squared_error', optimizer='adam')

我想向损失函数添加确定性指标 sigma。例如。 sigma大小取决于预测的准确性,从而导致最小的损失。

loss = (y_pred-y_true)^2/(2*sigma^2) + log(sigma)

然后,NN的最终输出将是y_predsigma

我在实现过程中有点迷路(对keras来说是新手):

  1. 我们将在哪里初始化/存储sigma,以便在训练期间围绕重复的类似数据点进行更新。
  2. 我们如何将变量sigma从损失函数连接到第二个NN输出。

我目前的基础结构,显然我缺少这些东西

def custom_loss(y_true, y_pred, sigma):
    loss = pow((y_pred - y_true), 2)/(2 * pow(sigma, 2))+math.log(sigma)
    return loss, sigma

model = Sequential()
model.add(Dense(15, input_dim=7, kernel_initializer='normal'))
model.add(Dense(2, kernel_initializer='normal'))
model.compile(loss=custom_loss, optimizer='adam')

任何提示/指导都受到高度赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

关键是将y_pred从标量扩展到向量

def custom_loss(y_true, y_pred):
    loss = pow((y_pred[0] - y_true), 2) / (2 * pow(y_pred[1], 2)) + \
           tf.math.log(y_pred[1])
    return loss

model = Sequential()
model.add(Dense(15, input_dim=7, kernel_initializer='normal'))
model.add(Dense(2, kernel_initializer='normal'))
model.compile(loss=custom_loss, optimizer='adam')

然后模型将sigma返回到预测。

Y = model.predict(X)  # Y = [prediction, sigma]