2017-02-17 78 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

它解决了你的问题吗? –