我正在使用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
是[纬度,经度,温度]序列的数组,全部填充到相同的长度,值为[0,0,0]。当我训练这个网络时,第一个时期给了我大约63的损失,并且在更多的时期之后增加。
这导致稍后在代码中调用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]
]
答案 0 :(得分:0)
我有点肯定你误用了Keras的Masking层。有关详细信息,请查看文档here。
尝试使用屏蔽层,如:
model.add(Masking(0, input_shape=(max_sequence_length, in_dimension)))
因为我认为它只需要时间步维度中的掩蔽值,而不是整个时间维度和值(即[0,0,0])。
祝你好运。