2017-02-17 37 views
1

これは以前の投稿の重複かもしれませんが、ここに私のコードです。 私の入力Xは、長さ10の文字のシーケンスで、ランダムノイズが追加された1〜26の数字でエンコードされています。出力は、シーケンスの次の単語です。精度/損失は変更されません

from keras.models import Sequential 
from keras.layers.core import Dense, Activation 
from keras.layers.recurrent import LSTM 
import keras.optimizers 

in_out_neurons = 1 
hidden_neurons = 20 

model = Sequential() 

# n_prev = 100, 2 values per x axis 
model.add(LSTM(hidden_neurons, input_shape=(10, 1))) 
model.add(Activation('relu')) 
model.add(Dense(in_out_neurons)) 
model.add(Activation("sigmoid")) 
model.add(Activation("softmax")) 
rms = keras.optimizers.RMSprop(lr=5, rho=0.9, epsilon=1e-08, decay=0.0) 
sgd = keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.001, nesterov=False) 
model.compile(loss="binary_crossentropy", 
    optimizer='adam', 
    metrics=['accuracy']) 

(X_train, y_train), (X_test, y_test) = train_test_split(data) 

model.fit(X_train, y_train, batch_size=100, nb_epoch=50, validation_data=(X_test, y_test), verbose=1) 
score = model.evaluate(X_test, y_test, verbose=0) 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 

predicted = model.predict(X_test, batch_size=700) 

# and maybe plot it 
pd.DataFrame(predicted).to_csv("predicted.csv") 
pd.DataFrame(y_test).to_csv("test_data.csv") 

異なるロス関数とオプティマイザを変更しようとしました。運がない。

答えて

1

数字で文字を符号化するのは良い方法ではありません。それは数字として解釈されるので、YとZは互いに接近し合っていて意味がありません。これが埋め込み()レイヤーが存在する理由です。あるいは、ワンホットエンコーディングを検討するかもしれません。文字は長さ26のワンホットベクトルです。 "a"は[1 0 0 0 0 0 0 0 ... 0]になります。

これは、Softmaxを1つの値しか持たないレイヤーに置くからです。ソフトマックスの値が1つの場合、出力は常に1になるので、ネットワークは学習できません。 1前に何が起こったのか。

ソフトマックスはテンソルの確率密度を作るために使用され、可能な値が1つだけあれば確率1を得ます。その1つのニューロンを確率(0と1の間)にしたい場合は、シグマイド、ソフトマックスではない。

私はこれが助けてくれることを望みます。

+0

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

+0

あなたの問題を解決しましたか? –

関連する問題