2017-08-01 291 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的開銷很大。不過,我認爲在上一個版本中,他們已經引入了一些功能將網絡轉換爲可執行文件。儘管如此,仍需要更好的意見。