2017-08-01 188 views
0

所以我进行了一些研究,并有大量的物体的速度和加速度数据的两个人正在一起移动周围的房间。在此之前,我已经成功地训练了一个使用LSTM和RNN的时间序列预测神经网络,以预测物体的速度将是未来的一步。慢tensorflow培训和评估GPU

训练这个神经网络之后,我再增加它使用的预测,与以前的数据一起,来预测另一个时间步走向未来,等了一定数量的时间步长。我已经包含了这个看起来像什么的图形,NN_explanation。从本质上讲,我使用以前的数据(大小为N的时间步长由M个输入),以预测一个步骤,则该预测增加的输入的端,并且删除该输入的第一时间步长(以保持尺寸的N×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]当我训练这个神经网络,我使用的是TitanX GPU,它比我的CPU花费的时间更长。我在某处读到这可能是由于LSTM细胞的性质。这是真的?如果是这样,我有什么办法可以让我的GPU在这个网络上的训练速度更快,或者我只是坚持慢。

2]的训练结束后,我想在运行真实数据实时预测。不幸的是,使用sess.run(prediction,feed_dict)即使一次花费0.05秒。如果我想要获得的不仅仅是一个未来的预测步骤,那么假设预测的10个未来步骤,运行循环以获得10个预测需要0.5秒,这对于我的应用程序来说并不现实。是否有一个理由需要这么长时间来评估?我试图减少的时间步长(n_steps)的数量,以及今后的步骤,以预测数,这似乎减少花费的时间预测量。但我觉得这应该只影响训练时间,因为在评估时,神经网络已经训练了所有内容,并且应该简单地通过GPU来填充数字。有任何想法吗?

回答

1

关于问题1: 不使用GPU的所有NN受益。在可以并行进行大量乘法的情况下,GPU是很好的选择。因此,他们擅长运行卷积神经网络。但是,当谈到RNN时,CPU是最好的选择。如果您拥有这些资源,则可以使用Google Cloud ML-Engine,然后在CPU集群上运行它。

关于问题2: 使用sess.run()时,TensorFlow的开销很大。不过,我认为在上一个版本中,他们已经引入了一些功能将网络转换为可执行文件。尽管如此,仍需要更好的意见。

相关问题