可能是以前帖子的重复,但这是我的代码。 我的输入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")
尝试更改不同的损失函数和优化器。没有运气。
答案 0 :(得分:1)
按编号对字符进行编码不是一个好方法。它将被解释为数字,所以它就像说Y和Z靠近在一起并没有意义。这就是Embedding()层存在的原因。或者您可以考虑使用单热编码。然后字符是长度为26的单热矢量。 ""例如,将变为[1 0 0 0 0 0 0 0 0 ... 0]。
话虽这么说,它之所以不起作用的原因是因为你将一个Softmax放在一个只有一个值的图层上......一个值上的Softmax总是会给出输出1,所以你的网络可以'无论以前发生什么输出,都要学习。
Softmax用于使概率密度超出张量,如果只有一个可能的值,它将获得概率1.如果你想要一个神经元是一个概率(在0和1之间),只使用sigmoid ,而不是softmax。
我希望这有帮助:)