如何使用 TensorFlow 堆叠 LSTM 层

how to stack LSTM layers using TensorFlow

我有以下内容,我认为这是一个具有一个隐藏 LSTM 层的网络:

# Parameters
learning rate = 0.001
training_iters = 100000
batch_size = 128
display_step = 10

# Network Parameters
n_input = 13
n_steps = 10
n_hidden = 512
n_classes = 13

# tf Graph input
x = tf.placeholder("float", [None, n_steps, n_input])
y = tf.placeholder("float", [None, n_classes])

# Define weights
weights = {
    'out' : tf.Variable(tf.random_normal([n_hidden, n_classes]))
}
biases = {
    'out' : tf.Variable(tf.random_normal([n_classes]))
}

但是,我正在尝试使用 TensorFlow 构建 LSTM 网络来预测功耗。我一直在四处寻找一个很好的例子,但我找不到任何具有 2 个隐藏 LSTM 层的模型。这是我想要构建的模型:

1个输入层, 1个输出层, 2 个隐藏的 LSTM 层(每个层有 512 个神经元), 时间步长(序列长度):10

有人可以指导我使用 TensorFlow 构建这个吗? (从定义权重、构建输入形状、训练、预测、使用优化器或成本函数等),我们将不胜感激。

在此先感谢您!

以下是我在使用 GRU 单元的翻译模型中执行此操作的方法。你可以用 LSTM 替换 GRU。只需将 tf.nn.rnn_cell.MultiRNNCell 与它应该包装的多个单元格的列表一起使用真的很容易。在下面的代码中,我手动展开它,但您也可以将它传递给 tf.nn.dynamic_rnntf.nn.rnn

y = input_tensor
with tf.variable_scope('encoder') as scope:
    rnn_cell = rnn.MultiRNNCell([rnn.GRUCell(1024) for _ in range(3)])
    state = tf.zeros((BATCH_SIZE, rnn_cell.state_size))
    output = [None] * TIME_STEPS
    for t in reversed(range(TIME_STEPS)):
        y_t = tf.reshape(y[:, t, :], (BATCH_SIZE, -1))
        output[t], state = rnn_cell(y_t, state)
        scope.reuse_variables()
    y = tf.pack(output, 1)

首先你需要一些占位符来放置你的训练数据(一批)

x_input = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1])
y_output = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1])

一个 LSTM 需要一个状态,它由两个部分组成,隐藏状态和细胞状态,这里很好的指南:https://arxiv.org/pdf/1506.00019.pdf。对于 LSTM 中的每一层,您都有一个单元状态和一个隐藏状态。

问题在于 Tensorflow 将其存储在 LSTMStateTuple 中,您无法将其发送到占位符中。所以你需要把它存储在一个Tensor中,然后解压成一个元组:

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size])

l = tf.unpack(state_placeholder, axis=0)
rnn_tuple_state = tuple(
    [tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1])
     for idx in range(num_layers)]
)

然后您可以使用内置的 Tensorflow API 创建堆叠 LSTM 层。

cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True)
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True)
outputs, state = tf.nn.dynamic_rnn(cell, x_input, initial_state=rnn_tuple_state)

从这里您可以继续输出以计算 logits,然后计算 y_inputs 的损失。

然后你 运行 每批使用 sess.run 命令,使用 t运行 反向传播(这里有很好的解释 http://r2rt.com/styles-of-truncated-backpropagation.html

 init_state = np.zeros((num_layers, 2, batch_size, state_size))

...current_state... = sess.run([...state...], feed_dict={x_input:batch_in, state_placeholder:current_state ...})
current_state = np.array(current_state)

您必须先将状态转换为 numpy 数组,然后再输入它。

也许最好改用 Tflearn 或 Keras 这样的库?