2017-10-09 16 views
0

私はKerasで機械学習を始めようとしています。Keras:精度はゼロのままです

私は数学者ではなく、ニューラルネットワーク(ハハはそれを得る方法)の基本的な理解しか持っていないので、簡単に私に行ってください。

from keras.utils import plot_model 
from keras.models import Sequential 
from keras.layers import Dense 
from keras import optimizers 
import numpy 

# fix random seed for reproducibility 
numpy.random.seed(7) 

# split into input (X) and output (Y) variables 
X = [] 
Y = [] 
count = 0 

while count < 10000: 
    count += 1 
    X += [count/10000] 
    numpy.random.seed(count) 
    #Y += [numpy.random.randint(1, 101)/100] 
    Y += [(count + 1)/100] 
print(str(X) + ' ' + str(Y)) 

# create model 
model = Sequential() 
model.add(Dense(50, input_dim=1, kernel_initializer = 'uniform', activation='relu')) 
model.add(Dense(50, kernel_initializer = 'uniform', activation='relu')) 
model.add(Dense(1, kernel_initializer = 'uniform', activation='sigmoid')) 

# Compile model 
opt = optimizers.SGD(lr=0.01) 
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy']) 

# Fit the model 
model.fit(X, Y, epochs=150, batch_size=100) 

# evaluate the model 
scores = model.evaluate(X, Y) 
predictions = model.predict(X) 
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 
print (str(predictions)) 
##plot_model(model, to_file='C:/Users/Markus/Desktop/model.png') 

精度がゼロになったままで、予測が1の配列です:

これは私の現在のコードです。私は間違って何をしていますか?

答えて

2

分類問題(1つのホットベクトルスタイルの出力/カテゴリへの入力)ではなく、回帰問題(浮動小数点関数の出力)を解決しようとしています。

あなたのシグモイドファイナルレイヤーは0と1の間の出力しか得られません。これによりNNsが希望のY値の範囲をはるかに上回ると予測することができます。あなたのNNは出来るだけ近くにしようとしていますが、あなたはそれを制限しています!出力層のシグモイドは、単一クラスのyes/no出力には適していますが、回帰はありません。

したがって、入力がちょうど合計されるところで、最後のレイヤーが線形アクティブ化されるようにします。シグモイドの代わりにこのようなもの。 model.add(Dense(1, kernel_initializer='lecun_normal', activation='linear'))

少なくとも、学習率が十分低い場合は、少なくともそれはうまくいくでしょう。

有用なリンクのGoogle "keras regression"

1

あなたはbinary_crossentropyの損失機能を使用して、バイナリ分類を実行しようとしているようです。ただし、クラスラベルYは浮動小数点数です。ラベルは0または1でなければなりません。したがって、入力データには最大の問題があります。

次の例のように、データは、2つの異なる正規分布からサンプリングされた2つのクラスをより理にかなっているいくつかのデータを試すことができ、およびラベルは、各観測のための0または1のどちらかである:

X = np.concatenate([np.random.randn(10000)/2, np.random.randn(10000)/2+1]) 

Y = np.concatenate([np.zeros(10000), np.ones(10000)]) 

モデルはずこのタイプのデータでどこかに行くことができます。

+0

浮動小数点予測を行う方法はありませんか? –

+0

はいできます。損失関数を平均二乗誤差のようなものに変更する必要があります。これを確認してください:[](https://keras.io/losses/)。また、おそらく最後のレイヤーでシグモイド活性化を取り除きたいと思うかもしれません... –

+0

さて、私はそれを働かせました。しかし、その損失は小さなものでほとんどなく、ほとんど無くなります。どのような種類のネットワークをお勧めしますか? –

関連する問題