我正在尝试使用张量流中的堆叠 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 个时间步长,并且具有良好的准确性。
我相信无论以何种标准衡量,10000 个时间步都非常长。 这会导致或将导致几个问题:
在其他解决方案中,您可以: