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

问题描述 投票:0回答:1

我正在尝试使用张量流中的堆叠 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 输出输入全连接层的正确方法是什么?或者我应该在输出上使用 RNN 状态?

编辑: 澄清一下:我确实需要这些长序列,因为我正在尝试对物理系统进行建模。输入是一个单一特征,由白噪声组成。我有多个输出(在这个特定系统中为 45)。脉冲效果大约 10.000 个时间步长的系统状态。

即目前,我正在尝试对由振动器驱动的汽车齿轮桥进行建模。输出由 15 个加速度传感器测量到 3 个方向(X、Y 和 Z)。

任意选择 500 的批量大小。

无论长序列可能会消失梯度或潜在的内存问题,我都会对如何正确提供数据感兴趣。我们确实有合适的硬件(即 Nvidia Titan V)。此外,我们已经能够通过经典的 DNN 来对系统行为进行建模,滞后时间超过 3000 个时间步长,并且具有良好的准确性。

python tensorflow machine-learning neural-network recurrent-neural-network
1个回答
0
投票

我相信无论以何种标准衡量,10000 个时间步都非常长。 这会导致或将导致几个问题:

  • 您观察到的内存问题:反向传播梯度需要随时间存储所有状态
  • 训练中的性能:即使对于门控单元,梯度也可能不会达到第一个时间步长
  • 预测性能:假设网络经过适当训练,第一次观察不太可能对最终状态值产生任何影响,从而对预测产生任何影响,因此采取 10000 个时间步是浪费时间。

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

  • 通过(可能重叠)较小尺寸的块处理序列,并训练模型对每个块进行预测,然后聚合预测或进行一些中间融合,这将更难以实现,尤其是在可变长度序列持续时间的情况下。
  • 聚合和/或子采样输入或使用任何其他技巧来减少明显的持续时间,如果您担心失去精细的时间模式,可以在子采样之前使用时间卷积。
© www.soinside.com 2019 - 2024. All rights reserved.