2017-02-17 102 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 ... 0]。

這就是說,它不工作的原因是因爲你把一個Softmax放在一個只有一個值的圖層上......一個值上的Softmax總會給出輸出1,所以你的網絡不能學習,因爲輸出是1以前發生過什麼。

Softmax用於使概率密度超出張量,如果只有一個可能的值,它將得到概率1.如果你想要一個神經元是一個概率(介於0和1之間),只使用sigmoid,而不是softmax。我希望這有助於:)

+0

非常感謝。 – Hima

+0

它解決了你的問題嗎? –

相關問題