将堆叠的RNN输出输入到完全连接的层中

2024-03-29 12:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解决一个回归问题,在tensorflow中有一个叠加的RNN。RNN输出应输入一个完全连通的层,以进行最终预测。目前我正在努力研究如何将RNN输出输入最终的完全连接层。 我的输入是形状[批次大小,最大序列长度,数量特征]

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)

输出为[批次大小、最大序列长度、数量单位] 我尝试只使用最后一个时间步的输出,如下所示:

^{pr2}$

我还发现了一些例子和书籍,建议像这样重塑输出和目标:

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

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

我还发现了许多文章,建议取消堆叠输入和堆叠输出,因为形状不匹配,我无法开始工作。在

将RNN输出输入完全连接层的正确方法是什么?或者我应该使用RNN状态而不是输出?在

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

也就是说,目前我正在尝试建立一个汽车齿轮桥模型,它是由一个震动器动画。输出由15个加速度传感器在3个方向(X、Y和Z)进行测量。在

批量大小为500是任意挑选的。在

不管梯度消失或是长序列的潜在内存问题,我对如何正确地输入数据感兴趣。我们确实有合适的硬件(即Nvidia Titan V)。此外,我们已经能够用典型的DNN建模系统行为,其滞后时间超过3000个时间步,且精度较高。在


Tags: 数量tf系统时间cell序列特征contrib
1条回答
网友
1楼 · 发布于 2024-03-29 12:26:11

我相信以任何标准来衡量,一万个时间步都是很长的。 这将导致或将导致几个问题:

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

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

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

相关问题 更多 >