【发布时间】:2017-08-01 18:10:23
【问题描述】:
所以我正在做一些研究,并且有很多关于两个人一起在房间周围移动的物体的速度和加速度数据。之前,我已经成功地使用 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 填充数字。有什么想法吗?
【问题讨论】:
标签: python tensorflow gpu evaluation