LSTM 网络,用于具有初始化状态的每日天气预报



对于两个天气值的预测,我有一个数据集,其中包含一年的数据,分辨率为十五分钟。因此,每天有96个时间点的数据,总共365*96个。

每当我在 LSTM 网络中输入一天的数据进行训练时,我还想给出输出状态h的真实测量数据。

# tensor for setting output state h
init_state = tf.reshape(init_state, [1, 2])
init_state = tf.nn.rnn_cell.LSTMStateTuple(tf.constant([[0, 0]], tf.float32), init_state)
# tensor placeholder for input data with 2 inputs
train_placeholder = tf.placeholder(tf.float32, [1, 96, 2])
# hidden size equals 2, because LSTM output and output state h have 2 values
cell = tf.contrib.rnn.LSTMCell(2)
rnn_outputs_ts, state = tf.nn.dynamic_rnn(cell, train_placeholder,
dtype=tf.float32, initial_state=init_state) 

培训每天循环进行:

# daily training of the weather data
for step in len(train_data):
sess.run(train_lstm, {train_placeholder: train_data[step].reshape(1, 96, 2),
init_state: init_data[step].reshape(1, 2) })

如果我按照所述在每次迭代中设置输出状态 h,则比默认情况下输出状态 h 始终设置为零时得到更好的结果。

由于输出状态h包含两个值,I 输入了实际测量值,因此 LSTM 单元的隐藏大小也限制为 2。 但是,在没有手动设置输出状态h的情况下,我注意到如果 LSTM 单元的隐藏大小大于 2 并且输出变平为 2,则可能会获得更好的结果。MultiRNNCell也是如此,由于输出状态h,我也不使用它。

一方面,我想要一个更大的 LSTM 网络,但另一方面,我还想用真实的测量数据设置输出状态h

在我的案件中,你会怎么做?

我认为你需要另一层 - 网络通常有一个输入层,一个数字中间层和一个执行最终分类的输出层。在您的情况下,您可以在 LSTM 层之后添加一个带有 2 个神经元的 Dense() 层。

此外,LSTMCell 已被弃用 (https://www.tensorflow.org/api_docs/python/tf/nn/rnn_cell/LSTMCell),并将在 tensorflow 2.0 中删除。我建议使用 Keras(张量流的包装器)来设置您的网络 - 它提供了许多方便的功能并帮助分析您的模型。查看此处以获取有关如何设置 LSTM 模型的说明:https://adventuresinmachinelearning.com/keras-lstm-tutorial/

最新更新