2017-02-23 5 views
1

機械学習のモデルを訓練するための正確さについて助けが必要です。機械学習の精度が0を示しています

私のトレーニングの入力は、500個の整数/データを含むいくつかの配列で、hdf5ファイルに 'the_data'という名前のデータセットで保存しました。この例では、100個の配列があります。

[[1,2,3,...500], 
[501,502,...1000], 
[1001,...  ], 
.... 
......   ]] 

出力は、私は手を前に生成し、「output.txtと」としてそれを保存乱数です。それは100の乱数を持っています。以下は

194521, 307329, 182440, 180444, 275690,...,350879 

http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

import h5py 
from keras.models import Sequential 
from keras.layers import Dense 

seed = 7 
np.random.seed(seed) 

input_data = h5py.File('test.h5', 'r') 
output_data = open("output.txt", "r") 

X = input_data['the_data'][:] 
Y = output_data.read().split(',') 

model = Sequential() 
model.add(Dense(500, input_dim=500, init='normal', activation='relu')) 
model.add(Dense(100, init='normal', activation='relu')) 
model.add(Dense(60, init='normal', activation='relu')) 
model.add(Dense(1, init='normal', activation='sigmoid')) 

model.compile(loss='binary_crossentropy', optimizer='adamax', metrics=['accuracy']) 
model.fit(X, Y, nb_epoch=500, batch_size=10) 
scores = model.evaluate(X, Y) 

print("%s: %.2f%% , %s: %.2f%%" % (model.metrics_names[0], scores[0]*100, model.metrics_names[1], scores[1]*100)) 

に基づいて、私の修正スクリプトは結果がこの

Epoch 500/500 
100/100 [==============================] - 0s - loss: -4851446.0896 - acc: 0.0000e+00 
100/100 [==============================] - 0s 
loss: -485144614.93% , acc: 0.00% 

のようなものであるように私が得たもの誰もこれが起こったん理由についてどんな考えを持っていますか?

ありがとうございました。

答えて

3

バイナリクロスエントロピーは何ですか?

これは、ターゲットがバイナリ(0または1)であるために作られた損失関数です。損失は​​、目標値に応じてoutputまたはoutput - 1の何らかの対数です。 あなたはあなたのケースでそれを適用することはできません。

数値を予測したいので、根平均平方誤差のようなものを使用する必要があります。

正確さは、あなたがクラスを予測しようとしているのではなく、実数の値として感知しません。それはまれに良いものを正確に予測することはありません。たとえばバイナリクロスエントロピーで精度を使用すると、0.7の出力をクラス1に分類することができます.0.2はクラス0に分類されます。

もう1つのコメント:なぜランダムな値を予測したいのですか?ネットワークはパターンを認識する必要があり、ランダムなターゲットにはパターンがありません。

私はこれが少し助けてくれることを願っています。

+0

はい、私のためにバイナリクロスエントロピーを指示していただきありがとうございます。私はアウトプットに集中しすぎていたので、あまり考えなかった。私はあなたが提案したものについてもっと見ていきます。 また、ネットワークが数字の値を出力として認識できるかどうか試したかっただけです。その他の理由はありません。 ありがとうございます。 – Fang

1

私はNassim Benに同意します。

from sklearn.metrics import mean_squared_error 

mse = mean_squared_error(Y,Y_predicted) 

print('MSE : %.3f' % mse) 
print("Acc = ", 1-numpy.sqrt(mse)) 

これは私の仕事: あなたが別の方法が必要に精度を計算し、その後、この

model.compile(loss='mean_square', optimizer='sgd') 

を使用してみてください。しかし、正直なところ、ケラスは高い数字(0〜1以外の数字)を予測するのにうまくいきません。 これについて間違っていたら私は幸せになれます。

+0

あなたの答えをありがとう。私は 'mean_square'について検索しましたが、実際にそれをどのように使用するかについては理解していませんでした。あなたが提案したように私は試してみて、私の質問でそれを更新します。 – Fang

+0

このため、入力とターゲットを正規化することをお勧めします。また、出力を制限するため、Sigmoidやtanhなどのアクティベーションを使用するとうまく動作しません。 –