我正在搞乱LSTM并且有一个概念性的问题。我根据以下规则创建了一个虚假数据矩阵:
对于矩阵中的每个1-D列表:
这样,它是一个非常简单地基于先前信息的序列。我设置了一个LSTM来学习重现并运行它一次一个地在列表上训练。我有一个LSTM层,后面是一个完全连接的前馈层。它非常容易地学习+1步骤,但是对于sin步骤有困难。当前一个元素大于10时,它似乎会在下一个元素中选择一个介于-1和1之间的随机数。我的问题是:训练只是修改完全连接的Feed中的变量前进层?这就是为什么它不能学习非线性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并没有学到任何东西。