代码之家  ›  专栏  ›  技术社区  ›  DarkHawk

tensorflow中LSTM的多元输入

  •  4
  • DarkHawk  · 技术社区  · 7 年前

    在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提供例如每秒的湿度率和风速。这将是一个LSTM,有3个序列作为输入,每个输入将包含30分钟*60个测量值。

    我需要添加一个“number\u 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)
    

    提前谢谢你。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nipun Wijerathne    7 年前

    我编辑了你的代码,这样你就可以得到你需要的结果,

    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\u size 3]。现在,x的形状是tf static\u rnn方法所需的。

    希望这有帮助。