Keras 自定义损失(chi2)线性回归

Posted

技术标签:

【中文标题】Keras 自定义损失(chi2)线性回归【英文标题】:Keras custom loss (chi2) linear regression 【发布时间】:2017-10-14 15:56:13 【问题描述】:

我正在尝试使用自定义损失函数在 Keras 中实现简单的线性回归。我正在计算 chi2 假设误差是函数值的 1%。我在线性模型中添加了 1% 的高斯噪声。当我使用均方误差损失函数 ('mse') 时,我可以添加 custom_loss() 函数作为度量,我看到它收敛到非常接近 1 (chi2/ndf)。如果我直接使用custom_loss()作为如下sn-p所示的损失函数,神经元的权重根本不动。

我做错了什么?

from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
from keras import backend as K
import numpy as np

def custom_loss(y_true, y_pred):
    return K.mean(K.square(y_pred-y_true)/K.clip(K.square(0.01*y_pred), K.epsilon(), None), axis=-1)

def build_model():
    model = Sequential()
    model.add(Dense(1, input_dim=1, activation='linear'))

    sgd = optimizers.SGD(lr=0.01, momentum=0.01, nesterov=False)
    model.compile(optimizer=sgd, loss=custom_loss, metrics=['mape', 'mse', custom_loss])
    return model

if __name__ == '__main__':

    model = build_model()

    x_train = np.linspace(0.0, 1.0, 500)
    y_train = np.array(map(lambda x: x + 0.01*x*np.random.randn(1), x_train))

    model.fit(x_train, y_train, shuffle=True, epochs=1000, batch_size=10)

【问题讨论】:

【参考方案1】:

我不确定究竟你想用这个损失计算什么,但这是我在 [-1, 1] 和 y_true=0.5 中绘制 y_pred 时看到的:

Custom Loss

显然有 2 个最小值,0 附近的一个非常陡峭的斜率(当 y_pred=0 时未定义)和其他地方的低斜率。请注意,网络很容易在这里走错损失函数的“臂”。

将此损失与平方误差进行比较:

MSE

我会重新审视你的损失函数:你想让网络在这里学习什么?

【讨论】:

感谢您的回复。我正在尝试训练网络以将沿线 (y = x) 的点预测到 1% 以内的准确度。我试图在这里构造 chi2 函数,并“手动”将不确定性插入为真实值(denom)的 1%。我还在线路中添加了 1% 的噪音。当网络预测误差在 1% 以内时,这个 custom_loss 给出大约 1。均方误差在这种情况下效果很好,但在我的实际代码中,由 y 表示的函数的值变得非常小。所以网络在这些领域不太适合。我正在努力避免这个问题。谢谢

以上是关于Keras 自定义损失(chi2)线性回归的主要内容,如果未能解决你的问题,请参考以下文章

为 Keras ANN-线性回归选择层/函数

机器学习 之 线性回归 概念总结速记

pytorch结构化封装:线性与逻辑回归

ANN线性回归模型的评估

回归问题及应用

史诗级干货长文线性回归算法