我正在搞乱LSTM并且有一个概念性的问题 . 我根据以下规则创建了一个虚假数据矩阵:

对于矩阵中的每个1-D列表:

  • 如果前一个元素小于10,则下一个元素是前一个元素加1 .

  • 否则,这个元素是罪(前一个元素)

这样,它是一个非常简单地基于先前信息的序列 . 我设置了一个LSTM来学习重现并运行它一次一个地在列表上训练 . 我有一个LSTM层,后面是一个完全连接的前馈层 . 它非常容易地学习了1步,但是对于罪恶步骤有困难 . 当前一个元素大于10时,它似乎会在下一个元素中选择一个介于-1和1之间的随机数. My question is this :训练是否只修改完全连接的前馈层中的变量?这就是为什么它不能学习非线性sin函数?

这是有问题的代码段:

lstm = rnn_cell.LSTMCell(lstmSize)
y_ = tf.placeholder(tf.float32, [None, OS])

outputs, state = rnn.rnn(lstm, x, dtype=tf.float32)
outputs = tf.transpose(outputs, [1, 0, 2])
last = tf.gather(outputs, int(outputs.get_shape()[0]) - 1)

weights = tf.Variable(tf.truncated_normal([lstmSize, OS]))
bias = tf.Variable(tf.constant(0.1, shape=[OS]))

y = tf.nn.elu(tf.matmul(last, weights) + bias)
error = tf.reduce_mean(tf.square(tf.sub(y_, y)))
train_step = tf.train.AdamOptimizer(learning_rate=1e-3).minimize(error)

错误和形状组织似乎是正确的,至少在它确实快速学习1步而不崩溃的意义上 . LSTM不应该能够处理非线性sin函数吗?这似乎很简单,所以我的猜测是我设置了一些错误,LSTM没有学到任何东西 .