所以我正在进行一些研究,并且有很多物体的速度和加速度数据被一个房间周围的两个人一起移动。以前,我已经成功地使用LSTM和RNN训练了一个时间序列预测神经网络,以预测对象的速度将是未来一步的步骤。
在训练了这个NN之后,我对其进行了扩充,以便使用预测以及之前的数据来预测未来的另一个时间步,等等一定数量的时间步。我已经包含了这个图片的图片NN_explanation。基本上,我使用先前的数据(大小为N个时间步长的M个输入)来预测一个步骤,然后将此预测添加到输入的末尾,并删除输入的第一个时间步长(以保持大小N x M)然后再次训练下一个时间步,直到我有P个未来预测与测量数据进行比较。
这是我的变量
x = tf.placeholder(tf.float32,[None, n_steps, n_inputs])
y = tf.placeholder(tf.float32,[None, n_outputs])
W = {'hidden': tf.Variable(tf.random_normal([n_inputs, n_nodes])),
'output': tf.Variable(tf.random_normal([n_nodes,n_outputs]))}
bias = {'hidden': tf.Variable(tf.random_normal([n_nodes],mean= 1.0)),
'output': tf.Variable(tf.random_normal([n_outputs]))
这是我的模特
def model(x,y,W,bias):
x = tf.transpose(x,[1,0,2])
x = tf.reshape(x,[-1,n_inputs])
x = tf.nn.relu(tf.matmul(x,W['hidden']) + bias['hidden'])
x = tf.split(x,n_steps,0)
cells = []
for _ in xrange(n_layers):
lstm_cell = rnn.BasicLSTMCell(n_nodes, forget_bias = 1.0, state_is_tuple = True)
cells.append(lstm_cell)
lstm_cells = rnn.MultiRNNCell(cells,state_is_tuple = True)
outputs,states = rnn.static_rnn(lstm_cells, x, dtype = tf.float32)
output = outputs[-1]
return tf.matmul(output, W['output') + bias['output']
所以我有两个问题:
1]当我训练这个NN时,我使用的是TitanX GPU,它比我的CPU耗时更长。我在某处读到这可能是由于LSTM细胞的性质。这是真的?如果是这样,有什么方法可以让我的GPU上的网络训练更快,或者我只是坚持它很慢。
2]训练结束后,我想用实际数据实时运行预测。不幸的是,使用sess.run(prediction,feed_dict)
甚至一次需要0.05秒。如果我想获得的不仅仅是一个未来的预测步骤,那么让我们说10个未来的预测步骤,运行一个循环来获得10个预测则需要0.5秒,这对我的应用来说是不现实的。是否需要花这么长时间来评估?我已经尝试减少时间步数(n_steps),以及预测的未来步骤数,这似乎减少了预测所需的时间。但我觉得这只会影响训练时间,因为在评估时,NN已经训练了所有内容,应该只是通过GPU填充数字。有什么想法吗?
答案 0 :(得分:2)
关于问题1: 并非所有NN都能从使用GPU中受益。 GPU很好,可以并行化大量的乘法。因此,他们非常擅长运行卷积神经网络。但是,当谈到RNN时,CPU最好用。如果您拥有这些资源,则可以使用Google Cloud ML-Engine并在CPU群集上运行它。
关于问题2: 使用sess.run()时,TensorFlow的开销很大。但是,我认为在上一个版本中他们已经引入了一些将网络转换为可执行文件的功能。关于它,需要更好的意见。