首页 文章

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

提问于
浏览
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个时间步长的滞后,具有良好的准确性 .

1 回答

  • 0

    我认为任何标准都有10000个时间步长 . 这会导致或将导致几个问题:

    您观察到的

    • 内存问题:反向传播渐变需要沿着时间存储所有状态

    • 训练中的表现:即使对于门控单位,梯度也可能无法达到第一时间步

    • 预测性能:假设网络经过适当训练,第一次观测不太可能对最终状态值产生任何影响,从而影响预测,因此采用10000个时间步骤是浪费时间 .

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

    • 通过(可能重叠)较小尺寸的块处理序列并训练模型以对它们中的每一个进行预测,然后聚合预测或进行一些中间融合,这将更难以实现,尤其是具有可变长度序列持续时间 .

    • 聚合和/或子采样输入或使用任何其他技巧来减少表观持续时间,如果您害怕丢失精细的时间模式,可能在子采样之前使用时间卷积 .

相关问题