TensorFlow中的多对多LSTM:训练误差未减少

TensorFlow中的多对多LSTM:训练误差未减少,tensorflow,sequence,lstm,Tensorflow,Sequence,Lstm,我试图使用训练LSTM来表现得像一个控制器。这是一个多对多的问题。我有7个输入特征,每个特征是40个值的序列。我的输出有两个特性,也是由40个值组成的序列 我有两层。第一层有四个LSTM单元,第二层有两个LSTM单元。代码如下所示 代码按预期运行并生成输出,但我无法减少训练误差(均方误差)。错误在前1000个时代之后停止改善 我试着使用不同的批量大小。但即使批量大小为1,我也会得到很高的错误。我用一个简单的正弦函数尝试了相同的网络,它工作正常,即误差在减小。这是因为我的序列长度太大,所以出现了消

我试图使用训练LSTM来表现得像一个控制器。这是一个多对多的问题。我有7个输入特征,每个特征是40个值的序列。我的输出有两个特性,也是由40个值组成的序列

我有两层。第一层有四个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}))    
“第一层有四个LSTM单元,第二层有两个LSTM单元,代码如下”是什么意思?也许你想知道细胞的状态

您的代码不完整,但我可以尝试给您一些建议

  • 如果你的训练误差没有下降,那么很可能是你的网尺寸不够大。可能您的
    lstm1\u大小
    lstm2\u大小
    不够大,无法捕获数据的特征
  • LSTM帮助您在状态向量中累积给定序列的过去。通常情况下,状态向量本身并不用作预测器,而是使用标准前馈层将其投影到输出空间。也许您可以只保留一个递归层(单个LSTM层),然后使用前馈层(例如(W*LSTM_outputs+b),其中g是非线性激活)投影该层的输出