【问题标题】:Accuracy/Loss doesn't change准确性/损失不会改变
【发布时间】:2017-02-17 09:02:44
【问题描述】:

这可能与以前的帖子重复,但这是我的代码。 我的输入 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")

尝试更改不同的损失函数和优化器。没有运气。

【问题讨论】:

    标签: sequence keras prediction lstm


    【解决方案1】:

    按数字编码字符不是一个好方法。它将被解释为数字,所以就像说 Y 和 Z 靠得很近,这是没有意义的。这就是 Embedding() 层存在的原因。或者您可以考虑 one-hot encoding 。然后,字符是长度为 26 的 one-hot 向量。 例如,“a”将变为 [1 0 0 0 0 0 0 0 0 ... 0]。

    话虽如此,它不起作用的原因是因为您将 Softmax 放在只有一个值的层上......一个值上的 Softmax 将始终给出输出 1,因此您的网络无法学习,因为输出为 1之前发生的任何事情。

    Softmax 用于从张量中得出概率密度,如果只有一个可能的值,它将得到概率 1。如果您希望一个神经元成为概率(介于 0 和 1 之间),请仅使用 sigmoid ,而不是softmax。

    我希望这会有所帮助:)

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2016-04-12
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多