Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning Keras自定义损失(chi2)线性回归_Machine Learning_Neural Network_Keras - Fatal编程技术网

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

Machine learning Keras自定义损失(chi2)线性回归,machine-learning,neural-network,keras,Machine Learning,Neural Network,Keras,我正在尝试使用自定义损失函数在Keras中实现一个简单的线性回归。我计算chi2时假设误差为函数值的1%。我在线性模型中加入1%的高斯噪声。当我使用均方误差损失函数(“mse”)时,我可以添加自定义的_loss()函数作为度量,我发现它收敛到非常接近1(chi2/ndf)。如果我直接使用自定义的_loss()函数作为loss函数,如下面的代码片段所示,神经元的权重根本不会移动 我做错了什么 from keras.models import Sequential from keras.layers

我正在尝试使用自定义损失函数在Keras中实现一个简单的线性回归。我计算chi2时假设误差为函数值的1%。我在线性模型中加入1%的高斯噪声。当我使用均方误差损失函数(“mse”)时,我可以添加自定义的_loss()函数作为度量,我发现它收敛到非常接近1(chi2/ndf)。如果我直接使用自定义的_loss()函数作为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,1]中绘制y_pred,y_true=0.5时,我看到了以下内容:

很明显,它有2个极小值,在0附近有一个非常陡峭的坡度(当y_pred=0时未定义),其他地方的坡度很低。请注意,在这里,网络很容易进入损失函数的错误“臂”

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


我想重温一下你的损失函数:你想让网络在这里学到什么?

谢谢你的回复。我正在尝试训练网络,以预测沿线(y=x)的点,使其精度在1%以内。我尝试在这里构造chi2函数,并“手动”插入不确定度为真值(denom)的1%。我还增加了1%的噪音线。当网络预测误差在1%以内时,此自定义_损失约为1。在这种情况下,均方误差非常有效,但在我的实际代码中,由y表示的函数值非常小。所以网络不适合这些领域。我正在努力避免那个问题。谢谢