我想创建一个基本的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()
但是,有很多悬而未决的问题:
答案 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 强>。您可以在下面看到图片。
以同样的方式,您将在GRUCell中得到states
的形状为[batch_size, num_units ]
。
outputs
表示每个时间步的输出,因此默认情况下(time_major = False)其形状为[batch_size, timesteps, num_units]
。您可以轻松得出结论
state[1, batch_size, : ] == outputs[ batch_size, -1, : ]
。