8

我得到了一些这种格式的数据和以下细节:

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

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

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

如果这对我拥有的数据没有意义,请在这里阻止我。那么问题来了:

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

我已经使用 tflearn 查看了这个示例,但我不了解它的输入格式,因此我可以将其“镜像”到我的。同样,在一个非常相似的问题上发现了这篇文章,但看起来海报中的样本之间并不相关,因为它们在我的中。我对 tensorflow 的体验仅限于它的入门页面。

4

1 回答 1

15

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

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

无论如何,您在这里得到的是特征向量(feature1 ... featureN)的不同长度(day1 ... day?)的序列。首先,你需要一个LSTM 单元

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-vector 填充它们到最大长度并将适当的sequence_length参数传递给dynamic_rnn

显然我跳过了很多细节,所以要完全理解 RNN,你可能应该阅读许多优秀的 RNN 教程之一,例如这个

于 2017-04-11T21:06:11.757 回答