张量流中 LSTM 的多元输入
Multivariate input for LSTM in tensorflow
我在尝试在 Tensorflow 下实现具有多个输入序列(多变量)的 LSTM 时遇到了一些疑问。
我是这样定义LSTM的:
def LSTM(x):
x = tf.reshape(x, [-1, input_length])
x = tf.split(x, input_length, 1)
rnn_cell = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden), rnn.BasicLSTMCell(n_hidden)])
outputs, states = rnn.static_rnn(rnn_cell, x, dtype=tf.float32)
return tf.matmul(outputs[-1], weights['out']) + biases['out']
数据张量是这样定义的:
# tf Graph input
X = tf.placeholder("float", [None, input_length, 1])
Y = tf.placeholder("float", [None, n_classes])
这对于已知长度的一维输入是可以的。我会给你一个简单的例子:
您每秒测量一次降雨率,因此您有一个大小为 N 的时间序列。您想要提前 30 分钟预测降雨率,因此您每 30 分钟将数据分成几段。因此,您可以为 LSTM 提供 30(分钟)*60(每秒一次)测量值的输入,输出将是从上次给定输入(一次测量值)起 30 分钟后的降雨率。
到这里,这个简单的模型就解决了问题,但是我应该怎么添加另一个输入呢?也就是说,不是仅使用降雨率来预测 30 分钟后的自身,而是还向 LSTM 提供例如每秒的湿度率和风速。那将是一个具有 3 个序列作为输入的 LSTM,并且每个输入都将包含 30 分钟 * 60 个测量值。
我需要添加一个 "number_of_sequences" 变量,但我不确定如何重新组织张量。我应该从我的代码中更改什么?我对 X 占位符的三个维度有点迷茫,也许是这样的?
X = tf.placeholder("float", [None, input_length, number_of_sequences])
还有将普通数据库转换成序列的代码,也许是这个?:
x = tf.reshape(x, [-1, input_length])
x = tf.split(x, input_length, number_of_sequences)
提前谢谢你。
我编辑了您的代码,以便您可以获得所需的结果,
input_length = 30*60
number_of_sequences =3
X = tf.placeholder("float", [None, input_length, number_of_sequences])
x = tf.reshape(X, [-1, input_length*number_of_sequences])
x = tf.split(x, input_length, 1)
现在x是一个长度为30*60的列表,列表中的一个元素的形状是[batch_size 3]。现在 x 的形状是 tf static_rnn 方法所要求的形状。
希望对您有所帮助。
我在尝试在 Tensorflow 下实现具有多个输入序列(多变量)的 LSTM 时遇到了一些疑问。
我是这样定义LSTM的:
def LSTM(x):
x = tf.reshape(x, [-1, input_length])
x = tf.split(x, input_length, 1)
rnn_cell = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden), rnn.BasicLSTMCell(n_hidden)])
outputs, states = rnn.static_rnn(rnn_cell, x, dtype=tf.float32)
return tf.matmul(outputs[-1], weights['out']) + biases['out']
数据张量是这样定义的:
# tf Graph input
X = tf.placeholder("float", [None, input_length, 1])
Y = tf.placeholder("float", [None, n_classes])
这对于已知长度的一维输入是可以的。我会给你一个简单的例子: 您每秒测量一次降雨率,因此您有一个大小为 N 的时间序列。您想要提前 30 分钟预测降雨率,因此您每 30 分钟将数据分成几段。因此,您可以为 LSTM 提供 30(分钟)*60(每秒一次)测量值的输入,输出将是从上次给定输入(一次测量值)起 30 分钟后的降雨率。
到这里,这个简单的模型就解决了问题,但是我应该怎么添加另一个输入呢?也就是说,不是仅使用降雨率来预测 30 分钟后的自身,而是还向 LSTM 提供例如每秒的湿度率和风速。那将是一个具有 3 个序列作为输入的 LSTM,并且每个输入都将包含 30 分钟 * 60 个测量值。
我需要添加一个 "number_of_sequences" 变量,但我不确定如何重新组织张量。我应该从我的代码中更改什么?我对 X 占位符的三个维度有点迷茫,也许是这样的?
X = tf.placeholder("float", [None, input_length, number_of_sequences])
还有将普通数据库转换成序列的代码,也许是这个?:
x = tf.reshape(x, [-1, input_length])
x = tf.split(x, input_length, number_of_sequences)
提前谢谢你。
我编辑了您的代码,以便您可以获得所需的结果,
input_length = 30*60
number_of_sequences =3
X = tf.placeholder("float", [None, input_length, number_of_sequences])
x = tf.reshape(X, [-1, input_length*number_of_sequences])
x = tf.split(x, input_length, 1)
现在x是一个长度为30*60的列表,列表中的一个元素的形状是[batch_size 3]。现在 x 的形状是 tf static_rnn 方法所要求的形状。
希望对您有所帮助。