Tensorflow动态RNN(LSTM):如何格式化输入?

时间:2017-04-11 09:04:59

标签: python tensorflow lstm recurrent-neural-network tflearn

我收到了一些这种格式的数据和以下详细信息:

person1, day1, feature1, feature2, ..., featureN, label
person1, day2, feature1, feature2, ..., featureN, label
...
person1, dayN, feature1, feature2, ..., featureN, label
person2, day1, feature1, feature2, ..., featureN, label
person2, day2, feature1, feature2, ..., featureN, label
...
person2, dayN, feature1, feature2, ..., featureN, label
...
  • 总有相同数量的功能,但每个功能可能都是0代表什么
  • 每个人都有不同的天数,例如: person1有20天的数据,person2有50个

目标是预测第二天的人的标签,因此dayN + 1的标签,无论是基于每个人还是整体(每个人更有意义)我)。我可以自由地重新格式化数据(它不是很大)。基于上面的一些阅读后我认为动态RNN(LSTM)可能效果最好:

  • 递归神经网络:因为第二天依赖于前一天
  • lstm:因为模型每天都在建立
  • 动态:因为并非每天都有所有功能

如果对我的数据没有意义,请在这里停止。 问题是:

如何为tensorflow / tflearn提供/格式化此数据?

我使用tflearn查看了this示例,但我不理解它的输入格式,以便我可以“镜像”它。同样地,在一个非常相似的问题上找到了this帖子,但是看起来海报所拥有的样本彼此之间并不相关,因为它们在我的中。我对tensorflow的体验仅限于get started页面。

1 个答案:

答案 0 :(得分:15)

  

动态:因为并非所有功能每天都存在

你在这里有错误的动态概念。 Tensorflow中的动态RNN 表示图形是在执行期间动态创建的,但输入总是相同的大小(0表示缺少某个功能应该可以正常工作)。

无论如何,你在这里得到的是特征向量(feature1 ... featureN)的不同长度(第1天......天?)的序列。首先,您需要LSTM cell

cell = tf.contrib.rnn.LSTMcell(size)

然后您可以使用tf.nn.dynamic_rnn创建动态展开的rnn图。来自文档:

  

输入:RNN输入。

     

如果time_major == False(默认值),则必须是形状张量:[batch_size,max_time,...]或此类元素的嵌套元组。

其中max_time指输入序列长度。因为我们使用的是dynamic_rnn,所以在编译期间不需要定义序列长度,因此输入占位符可以是:

x = tf.placeholder(tf.float32, shape=(batch_size, None, N))

然后将其输入到像

这样的rnn中
outputs, state = tf.nn.dynamic_rnn(cell, x)

表示您的输入数据应具有(batch_size, seq_length, N)形状。如果一个批次中的示例具有不同的长度,则应使用0向量填充最大长度,并将相应的sequence_length参数传递给dynamic_rnn

显然我已经跳过了很多细节,所以要完全理解RNN,你应该阅读许多优秀的RNN教程之一,比如this one