2017-04-19 17 views
2

私はこの単純なモデル(5チャンネル)を持っていると私はそれはそれは素晴らしい作品と私​​は完璧なゼロ損失を得る秒1損失計算におけるKerasコンポーネントの選択に

import keras 
import numpy as np 
import keras.backend as K 

data = np.random.normal(size = (1000, 5)) 

model = keras.models.Sequential() 
model.add(keras.layers.Dense(10, activation = 'linear',input_shape = (5,))) 
model.add(keras.layers.Dense(1, activation = 'linear')) 

def loss(x, y): 
    return K.mean(K.square(x - y)) 

model.compile('adam', loss) 
model.fit(data, data[:, 1], epochs = 100) 

を返すことを期待しています。

少し調整すると(出力に余分なチャンネルが追加されます)、2番目のチャンネルについて気にしないと決めました。

私はそれがこのように変更します。

import keras 
import numpy as np 
import keras.backend as K 

data = np.random.normal(size = (1000, 5)) 

model = keras.models.Sequential() 
model.add(keras.layers.Dense(10, activation = 'linear',input_shape = (5,))) 
model.add(keras.layers.Dense(2, activation = 'linear')) 

def loss(x, y): 
    return K.mean(K.square(x - y[:, 0])) 

model.compile('adam', loss) 
model.fit(data, data[:, 1], epochs = 100) 

そして今、訓練することは不可能です。私には狂っているようだ。誰が何が起きているのか知っていますか?

PS:この例は馬鹿に思えるかもしれませんが、より複雑な問題では私はカスタム損失を計算する必要があり、問題をこの単純な例に減らしました。

は私が最終的に修正(および潜在的な説明を)持って苦労の時間後にあなたの助け

答えて

1

いただきありがとうございます。

この例の問題(唯一の違い)は、インデックスの選択です。 Tensorflowがサポートしているようだが。それは正しく動作しません。 (問題のスニペットはTheano Backendで失敗します)。損失が正しく計算されているにもかかわらず、デリバティブが間違っているようです。オプティマイザを誤解させる。これがNNが訓練しない理由です。私が見つけたハックが、完全にワーキングソリューションは、私は試していないが、あなたがマルチバックエンドを探しているなら、それはあまりにもkeras.backend.dotで問題ないはず

tensorflow.matmul(y, [[1.0], [0.0]]) 

によって

y[:, 0] 

を交換することですもの。ウェイトに浮動小数点数を入れ、整数ではないことに注意してください。それ以外の場合は型チェックされません。

他の人に役立つことを願っています。

関連する問題