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

时间:2017-05-15 18:45:05

标签: machine-learning neural-network keras

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

我做错了什么?

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 个答案:

答案 0 :(得分:1)

我不确定完全您尝试使用此损失计算的内容,但这是我在[-1,1中绘制y_pred时所看到的内容],和y_true = 0.5:

Custom Loss

它显然有2个最小值,0左右非常陡峭的斜率(当y_pred = 0时未定义)和其他地方的低斜率。请注意,网络很容易发生错误的问题" arm"这里的损失函数。

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

MSE

我会重温你的损失功能:你想让网络在这里学习什么?