将堆叠的RNN输出馈送到完全连接的层

时间:2018-04-13 06:56:11

标签: python tensorflow neural-network recurrent-neural-network rnn

我试图用张量流中的堆叠RNN来解决回归问题。应将RNN输出馈入完全连接的层以进行最终预测。目前,我正在研究如何将RNN输出馈送到最终的完全连接层。 我的输入形状[batch_size,max_sequence_length,num_features]

RNN图层的创建方式如下:

cells = []
for i in range(num_rnn_layers):
    cell = tf.contrib.rnn.LSTMCell(num_rnn_units)
    cells.append(cell)

multi_rnn_cell = tf.contrib.rnn.MultiRNNCell(cells)


outputs, states = tf.nn.dynamic_rnn(cell=multi_rnn_cell,
                        inputs=Bx_rnn,dtype=tf.float32)

输出形状[batch_size,max_sequence_length,num_rnn_units] 我尝试只使用上一个时间步的输出:

final_outputs = tf.contrib.layers.fully_connected(
   outputs[:,-1,:],
   n_targets,
   activation_fn=None)

我还发现了一些示例和书籍,建议重塑输出和目标,如下所示:

rnn_outputs = tf.reshape(outputs, [-1, num_rnn_units])
y_reshaped = tf.reshape(y, [-1])

由于我目前使用的批量大小为500,序列长度为10000,因此导致巨大的矩阵,非常长的训练时间和巨大的内存消耗。

我还发现很多文章建议再次拆分输入和堆叠输出,由于形状不匹配,我无法开始工作。

将RNN输出馈送到full_connected层的正确方法是什么?或者我应该使用RNN状态而不是输出?

编辑: 澄清:我确实需要这些长序列,因为我试图建模物理系统。输入是一个单一的功能,由白噪声组成。我有多个输出(在这个特定的系统45中)。脉冲效应系统状态为约10,000个时间步长。

即。目前,我正试图模拟由摇床制作的汽车齿轮桥接。输出由15个加速度传感器测量到3个方向(X,Y和Z)。

批量大小500是任意选择的。

尽管长序列可能消失了梯度或潜在的内存问题,但我对如何正确提供数据感兴趣。我们有适当的硬件(即Nvidia Titan V)。此外,我们已经能够通过经典DNN对系统行为进行建模,其时滞步长> 3000,准确度高。

1 个答案:

答案 0 :(得分:0)

我相信任何标准都有10000个时间步长。 这会导致或将导致一些问题:

  • 您观察到的内存问题:反向传播渐变需要按时间存储所有状态
  • 训练中的表现:即使对于门控单位,渐变也可能无法达到第一时间步骤
  • 预测性能:假设网络训练有素,第一次观察不太可能对最终状态值产生任何影响,从而影响预测,因此采取10000个时间步骤是浪费时间。

在其他解决方案中,您可以:

  • 通过(可能重叠)较小尺寸的块处理序列并训练模型以对它们中的每一个进行预测,然后聚合预测或进行一些中间融合,这将更难以实现,尤其是具有可变长度序列持续时间。
  • 聚合和/或子采样输入或使用任何其他技巧来减少表观持续时间,如果您害怕丢失精细的时间模式,可能在子采样之前使用时间卷积。