2017-12-26 20 views
0

私は明らかに何かを理解していません(最初のケラス玩具)ケラス損失がコンバートに収束

私の入力x、y。 Xは1Dの実数値、yはスカラーです yが正か負かを予測したいと思います。 1つの方法は、1つのホットとして符号化し、categorical_cross_entropy(動作する)を使用し、もう1つは同じ(動作しません)を行うカストムロス関数です 私は8つの例を訓練しており、 。私のカスタム関数が0.56

で立ち往生ここでは、コードです:

import keras.backend as K 

def custom_cross_entrophy(y_true, y_pred): 
    '''expected return''' 
    return -(K.log(y_pred[:,0])*K.cast(y_true<=0, dtype='float32') 
      + K.log(y_pred[:,1])*K.cast(y_true>0, dtype='float32')) 

def build_model(x_dim, unites, loss_fuc): 
    model = Sequential() 

    model.add(Dense(
     units=unites, 
     activation='relu', 
     input_shape=(x_dim,), 
#   return_sequences=True 
    )) 
    model.add(Dense(
     units=2)) 
    model.add(Activation("softmax")) 

    start = time.time() 
    model.compile(loss=loss_fuc, optimizer="adam") 
    print("Compilation Time : ", time.time() - start) 
    return model 

今カスタム

model = build_model(X_train.shape[1], 20, custom_cross_entrophy) 
model.fit(X_train,y_train, 
    batch_size=8,epochs=10000, 
    validation_split=0.,verbose=0) 
print model.evaluate(X_train, y_train, verbose=1) 

#assert my custom_cross_entrophy is like catergorical_cross_entropy 
pred = model.predict(X) 
y_onehot = np.zeros((len(K.eval(y_true)),2)) 
for i in range(len(K.eval(y_true))): 
    y_onehot[i,int(K.eval(y_true)[i]>0)]=1 

print K.eval(custom_cross_entrophy(K.variable(y_train), K.variable(pred))) 
print K.eval(categorical_crossentropy(K.variable(y_onehot), K.variable(pred))) 

出力でモデルを構築し、実行:

( 'コンパイル時間:'、0.06212186813354492 ) 8/8 [==============] - 0秒52ms /ステップ 0.562335193157

[1.38629234 0.28766826 1.38613474 0.28766349 0.28740349 0.28795806 0.28766707 0.28768104]

[1.38629234 0.28766826 1.38613474 0.28766349 0.28740349 0.28795806 0.28766707 0.28768104]

は現在Keras損失で同じことを行う:

model = build_model(X_train.shape[1], 20, categorical_crossentropy) 

model.fit(X_train,y_onehot, 
    batch_size=8,epochs=10000, 
    validation_split=0.,verbose=0) 

print model.evaluate(X_train, y_onehot, verbose=1) 

出力: ( 'コンパイル時間:'、0.04332709312438965) 8/8 [===============] - 0秒34ms /ステップ 4.22694138251e-05

これはどのように可能ですか?損失は​​数学的に同じでなければならない ありがとう!

答えて

0

私の頭の上オフ、私はあなたが二つの異なる評価を実行していると言うだろう:

print model.evaluate(X_train, y_train, verbose=1) 
# ... 
print model.evaluate(X_train, y, verbose=1) 

が、私は、yとy_trainに何があるかわかりませんが、あなたは少しを展開する必要がある場合がありますあなたがやっていることやデータをどうやって分割しているかをもっと詳しく知ることができます。 試してみて、実行します。

print model.evaluate(X_train, y_onehot, verbose=1) 

それだけでタイプミスしたかどうかを確認します。

乾杯

+0

はい、yはy_onehotです(これを明確にするために編集しました) – user2232888

関連する問題