2017-06-15 116 views
0

我試圖使用訓練LSTM來表現得像控制器一樣。基本這是一個多對多的問題。我有7個輸入功能,每個功能都是40個值的序列。我的輸出有兩個特徵,也是40個值的序列。TensorFlow中的多對多LSTM:訓練錯誤不會減少

我有2層。第一層有四個LSTM單元,第二層有兩個LSTM單元。代碼如下。

該代碼運行併產生預期的輸出,但我無法減少訓練誤差(均方誤差)。錯誤只是在前1000個紀元後停止改進。

我試過使用不同的批量大小。但即使批量大小爲1,我也會收到很高的錯誤。我用簡單的正弦函數嘗試了同一個網絡,它正常工作,即錯誤正在減少。這是因爲我的序列長度太大,因此消失梯度問題正在發生。我能做些什麼來改善訓練錯誤?

#Specify input and ouput features 
Xfeatures = 7 #Number of input features 
Yfeatures = 2 #Number of input features 
num_steps = 40 

    # reset everything to rerun in jupyter 
tf.reset_default_graph() 
# Placeholder for the inputs in a given iteration. 
u = tf.placeholder(tf.float32, [train_batch_size,num_steps,Xfeatures]) 
u_NN = tf.placeholder(tf.float32, [train_batch_size,num_steps,Yfeatures]) 

with tf.name_scope('Normalization'): 
     #L2 normalization for input data 
     Xnorm = tf.nn.l2_normalize(u_opt, 0, epsilon=1e-12, name='Normalize') 

lstm1= tf.contrib.rnn.BasicLSTMCell(lstm1_size) 
lstm2 = tf.contrib.rnn.BasicLSTMCell(lstm2_size) 
stacked_lstm = tf.contrib.rnn.MultiRNNCell([lstm1, lstm2]) 

print(lstm1.output_size) 
print(stacked_lstm.output_size) 

LSTM_outputs, states = tf.nn.dynamic_rnn(stacked_lstm, Xnorm, dtype=tf.float32) 
#Loss 
mean_square_error = tf.losses.mean_squared_error(u_NN,LSTM_outputs) 
train_step =  tf.train.AdamOptimizer(learning_rate).minimize(mean_square_error) 
#Initialization and training session 
init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    sess.run(init) 
    #print(sess.run([LSTM_outputs],feed_dict={u_opt:InputX1})) 
    print(sess.run([mean_square_error],feed_dict={u_opt:InputX1,u_NN:InputY1})) 
    for i in range(training_epochs): 
     sess.run([train_step],feed_dict={u_opt:InputX1,u_NN:InputY1}) 
     if i%display_epoch ==0: 
      print("Training loss is:",sess.run([mean_square_error],feed_dict={u_opt:InputX1,u_NN:InputY1}),"at itertion:",i) 
    print(sess.run([mean_square_error],feed_dict={u_opt:InputX1,u_NN:InputY1})) 
    print(sess.run([LSTM_outputs],feed_dict={u_opt:InputX1}))  

回答

1

你是什麼意思:「第一層有四個LSTM單元,第二層有兩個LSTM單元,代碼在下面給出」?可能你打算細胞的狀態。

您的代碼不完整,但我可以嘗試給你一些建議。

  • 如果你的訓練錯誤沒有下降,那麼你的網絡的可能性不是很好。可能您的lstm1_sizelstm2_size不足以捕捉您數據的特徵。
  • LSTM幫助您累積狀態向量中給定序列的過去。通常情況下,狀態向量本身不會用作預測器,但它會使用標準前饋層投影到輸出空間。也許你可以保留單層遞歸(單層LSTM層),並且使用前饋層(即g(W * LSTM_outputs + b),其中g是非線性激活)來投影該層的輸出。