如何在TensorFlow中创建端执行基本LSTM网络?

时间:2019-02-19 10:51:34

标签: python tensorflow lstm

我想创建一个基本的LSTM网络,该网络接受5维矢量的序列(例如,作为N x 5数组),并返回4维隐藏矢量和单元矢量的相应序列(N x 4数组),其中N是时间步数。

我怎么做TensorFlow?

添加

到目前为止,我可以运行以下代码:

num_units = 4
lstm = tf.nn.rnn_cell.LSTMCell(num_units = num_units)

timesteps = 18
num_input = 5
X = tf.placeholder("float", [None, timesteps, num_input])
x = tf.unstack(X, timesteps, 1)
outputs, states = tf.contrib.rnn.static_rnn(lstm, x, dtype=tf.float32)

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

x_val = np.random.normal(size = (12,18,5))
res = sess.run(outputs, feed_dict = {X:x_val})
sess.close()

但是,有很多悬而未决的问题:

  1. 为什么要预设时间步数? LSTM是否应该能够接受任意长度的序列?
  2. 我们为什么要按时间步长拆分数据(使用unstack)?
  3. 如何解释“输出”和“状态”?

1 个答案:

答案 0 :(得分:2)

  

为什么要预设时间步数? LSTM是否应该接受   任意长度的序列?

如果要接受任意长度的序列,建议使用dynamic_rnn。您可以参考here了解它们之间的区别。

例如:

num_units = 4
lstm = tf.nn.rnn_cell.LSTMCell(num_units = num_units)

num_input = 5
X = tf.placeholder("float", [None, None, num_input])
outputs, states = tf.nn.dynamic_rnn(lstm, X, dtype=tf.float32)

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

x_val = np.random.normal(size = (12,18,5))
res = sess.run(outputs, feed_dict = {X:x_val})

x_val = np.random.normal(size = (12,16,5))
res = sess.run(outputs, feed_dict = {X:x_val})
sess.close()

dynamic_rnn在一批次中需要相同的长度,但是当您需要在一批中具有任意长度时,可以在填充批次数据后使用sequence_length参数指定每个长度。

  

我们是否按时间步长(使用unstack)拆分数据?

static_rnn仅需要unstack拆分数据,这取决于它们的不同输入要求。 static_rnn的输入形状是[timesteps,batch_size, features],它是形状为[batch_size, features]的2D张量的列表。但是dynamic_rnn的输入形状是[timesteps,batch_size, features][batch_size,timesteps, features],具体取决于time_major是True还是False。

  

如何解释“输出”和“状态”?

在LSTMCell中states的形状为[2,batch_size,num_units ],一个[batch_size, num_units ]代表 C ,另一个[batch_size, num_units ]代表 h 。您可以在下面看到图片。

enter image description here

enter image description here

以同样的方式,您将在GRUCell中得到states的形状为[batch_size, num_units ]

outputs表示每个时间步的输出,因此默认情况下(time_major = False)其形状为[batch_size, timesteps, num_units]。您可以轻松得出结论 state[1, batch_size, : ] == outputs[ batch_size, -1, : ]