【发布时间】:2016-07-02 09:48:09
【问题描述】:
我正在使用 Keras 构建和训练循环神经网络。
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Masking
from keras.layers.recurrent import LSTM
#build and train model
in_dimension = 3
hidden_neurons = 300
out_dimension = 2
model = Sequential()
model.add(Masking([0,0,0], input_shape=(max_sequence_length, in_dimension)))
model.add(LSTM(hidden_neurons, return_sequences=True, input_shape=(max_sequence_length, in_dimension)))
model.add(LSTM(hidden_neurons, return_sequences=False))
model.add(Dense(out_dimension))
model.add(Activation('softmax'))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")
model.fit(padded_training_seqs, training_final_steps, nb_epoch=5, batch_size=1)
padded_training_seqs 是一个 [latitude, longitude, temperature] 序列的数组,所有的长度都用 [0,0,0] 的值填充到相同的长度。当我训练这个网络时,第一个 epoch 给了我大约 63 的损失,并且在更多 epoch 之后增加。
这导致稍后在代码中调用model.predict 以提供完全脱离训练值的值。例如,每个序列中的大部分训练值都在[40, 40, 20] 附近,但RNN 输出值始终在[0.4, 0.5] 附近,这让我认为掩蔽层有问题。
训练 X (padded_training_seqs) 数据看起来像这样(只是更大):
[
[[43.103, 27.092, 19.078], [43.496, 26.746, 19.198], [43.487, 27.363, 19.092], [44.107, 27.779, 18.487], [44.529, 27.888, 17.768]],
[[44.538, 27.901, 17.756], [44.663, 28.073, 17.524], [44.623, 27.83, 17.401], [44.68, 28.034, 17.601], [0,0,0]],
[[47.236, 31.43, 13.905], [47.378, 31.148, 13.562], [0,0,0], [0,0,0], [0,0,0]]
]
训练 Y (training_final_steps) 数据如下所示:
[
[44.652, 39.649], [37.362, 54.106], [37.115, 57.66501]
]
【问题讨论】:
-
训练时增加的损失函数总是让我怀疑以过高的学习率跑步。您是否尝试过减少它,您可以通过将
keras.optimizers.RMSprop实例传递给model.compile调用来调整它。 -
@SimonGibbons 谢谢,但我已经解决了这个问题,但现在 model.predict 调用总是返回相同的值,不管输入的 x 数据如何。你知道是什么原因造成的吗?整个项目在这里github.com/jeshaitan/migration-lstm
-
您好,您的问题是如何解决的?你真的有高学习率吗?从您的程序中,我猜您使用的是默认学习率,即 0.01,对吗?
-
@ChangLiu 是的,我刚刚添加了一个 dropout 层,并按照 Keras 维护者的建议重新排列了模型中的层。然而,我的新问题还没有解决。我认为这可能是网络过度拟合,因为 model.predict 收敛于一个值。
-
@ChangLiu 我的新问题基本上在这里列出stats.stackexchange.com/questions/204329/…
标签: python machine-learning neural-network theano keras