2016-11-12 7 views
0

私は深く学習するのが初めてで、NOTロジックをkerasに実装しようとしています。しかし、結果は正しくありません。以下はコードです。
Kerasの単純なニューラルネットワークで、NOT論理が間違った出力を生成する

from keras.layers import Input, Dense 
from keras.models import Model 
import numpy as np 

inputs = Input(shape=(1,)) 
x = Dense(1024, activation='relu')(inputs) 
x = Dense(2048, activation='relu')(x) 
predictions = Dense(1, activation='softmax')(x) 

model = Model(input=inputs, output=predictions) 
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) 

X = np.array([[0.], [1.]], dtype=np.float32) 
y = np.array([[1.], [0.]], dtype=np.float32) 
print "learning....." 
model.fit(X, y, nb_epoch=100) 
print model.predict(X) 

出力:
ごとに出力が同じであるエポック:

Epoch 100/100 
2/2 [==============================] - 0s - loss: 0.5000 - acc: 0.5000 

との予測は次のとおりです。

[[ 1.] 
[ 1.]] 

私が何であるか、わかりませんこのネットワークでは間違っています。

答えて

1

あなたの損失の使い方は間違っています。 Softmaxは通常マルチクラスの予測に使用されており、出力はDense(2)を使用して2つの値からなるように設定しています。したがって、ターゲットをdim=2のマルチクラスターゲットにします。

from keras.layers import Input, Dense 
from keras.models import Model 
import numpy as np 

inputs = Input(shape=(1,)) 
x = Dense(1024, activation='relu')(inputs) 
x = Dense(2048, activation='relu')(x) 
predictions = Dense(2, activation='softmax')(x) 

model = Model(input=inputs, output=predictions) 
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) 

X = np.array([[0.], [1.]], dtype=np.float32) 
y = np.array([[1., 0], [0., 1]], dtype=np.float32) 
print "learning....." 
model.fit(X, y, nb_epoch=100) 
print model.predict(X) 

出力

Epoch 100/100 
2/2 [==============================] - 0s - loss: 1.5137e-07 - acc: 1.0000 
[[ 9.99880254e-01 1.19736877e-04] 
[ 5.35955711e-04 9.99464035e-01]] 

編集:最終層の活性化と損失関数の上記の設定は、バイナリ分類のための良いもの(おそらくない)であれば一つは主張することができます。シグモイドを使用してLink

代替とだけつのターゲット:どういたしまして@MrPyCharm

from keras.layers import Input, Dense 
from keras.models import Model 
import numpy as np 

inputs = Input(shape=(1,)) 
x = Dense(1024, activation='relu')(inputs) 
x = Dense(2048, activation='relu')(x) 
predictions = Dense(1, activation='sigmoid')(x) 

model = Model(input=inputs, output=predictions) 
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) 

X = np.array([[0.], [1.]], dtype=np.float32) 
y = np.array([1., 0.], dtype=np.float32) 
print "learning....." 
model.fit(X, y, nb_epoch=100) 
print model.predict(X) 

出力

Epoch 100/100 
2/2 [==============================] - 0s - loss: 9.9477e-07 - acc: 1.0000 
[[ 0.99945992] 
[ 0.00129277]] 
+1

。私はちょうど読まなければならないリンクを含むいくつかの編集を追加しました。これは、最初のケース(softmax with mse)のセットアップに関する小さな警告です。 – sascha

関連する問題