对于回归任务,我想自定义损失函数以另外输出确定性度量。
最初的正常网络为:
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_pred
和sigma
。
我在实现过程中有点迷路(对keras来说是新手):
sigma
,以便在训练期间围绕重复的类似数据点进行更新。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')
任何提示/指导都受到高度赞赏。谢谢!
答案 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]