2017-05-15 21 views
0

私はKerasで単純な線形回帰をカスタムロス関数を使って実装しようとしています。私はエラーが関数値の1%であると仮定してchi2を計算しています。線形モデルに1%のガウスノイズを加えます。平均2乗誤差損失関数( 'mse')を使用すると、custom_loss()関数をメトリックとして追加することができ、1に近づくことがわかります(chi2/ndf)。下のスニペットに示されているように、私が単にloss_functionとしてcustom_loss()を使用すると、ニューロンの重みはまったく動かない。Kerasカスタム損失(chi2)線形回帰

私は間違っていますか?

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.5あなたはこの損失を計算しようとしているもの正確わからないんだけど、ここで私は私がプロットするときにy_pred見るものだ[-1、1]、およびy_true:

Custom Loss

それは明らかに2最小値、(y_pred未定義= 0)0の周りに非常に急な斜面や他の場所で低スロープを持っています。ここでは、ネットワークが損失関数の間違った「腕」を下ろすのは非常に簡単です。

は二乗誤差に対してこの損失の比較:

MSE

を私はあなたの損失関数を再訪します:どのようなあなたはここで学ぶネットワークを持ってしようとしていますか?

+0

ご返信ありがとうございます。私は線に沿う点(y = x)を1%精度以内に予測するようにネットワークを訓練しようとしています。私はここでchi2関数を構築しようとしました。そして、 "手で"真値(denom)の1%となる不確実性を挿入しました。私はまた、ラインに1%のノイズを加えました。ネットワークが1%の誤差内で予測しているとき、このcustom_lossは約1を与えます。この場合、平均二乗誤差は大きくなりますが、実際のコードではyで表される関数の値は非常に小さくなります。だから、ネットワークはそれらの分野にうまく適合しません。私はその問題を回避しようとしています。ありがとう – dmriser