<p>模特可以随心所欲。如果我理解对了,你只想知道如何用LSTM创建模型?</p>
<p><strong>使用LSTMs</strong></p>
<p>首先,你必须定义你的编码向量是什么样子的。假设您希望它是一个由20个元素组成的数组,一个一维向量。所以,形状(无,20)。它的大小取决于你,没有明确的规则知道理想的。</p>
<p>你的输入必须是三维的,比如你的(1200,10,5)。在keras摘要和错误消息中,它将显示为(None,10,5),因为“None”表示批大小,每次训练/预测时,批大小都会有所不同。</p>
<p>有很多方法可以做到这一点,但是,假设您只需要一个LSTM层:</p>
<pre><code>from keras.layers import *
from keras.models import Model
inpE = Input((10,5)) #here, you don't define the batch size
outE = LSTM(units = 20, return_sequences=False, ...optional parameters...)(inpE)
</code></pre>
<p>这对于一个非常简单的编码器来说已经足够了,它可以生成一个包含20个元素的数组(但是如果需要,可以叠加更多的层)。让我们创建模型:</p>
<pre><code>encoder = Model(inpE,outE)
</code></pre>
<p>现在,对于解码器来说,它变得模糊了。你不再有一个真正的序列,而是一个静态的有意义的向量。你可能还想使用ltsm,他们会假设向量是一个序列。</p>
<p>但在这里,由于输入有shape(None,20),您必须首先将其重塑为某个三维数组,以便接下来附加一个LSTM层。</p>
<p>你将重塑它的方式完全取决于你。一个元素20步?一步20个元素?10步2个元素?谁知道呢?</p>
<pre><code>inpD = Input((20,))
outD = Reshape((10,2))(inpD) #supposing 10 steps of 2 elements
</code></pre>
<p>需要注意的是,如果您不再有10个步骤,您将无法只启用“返回序列”并获得所需的输出。你得工作一点。实际上,不需要使用“返回序列”,甚至不需要使用LSTMs,但您可以这样做。</p>
<p>因为在我的整形中我有10个时间步(有意),所以可以使用“返回序列”,因为结果将有10个时间步(作为初始输入)</p>
<pre><code>outD1 = LSTM(5,return_sequences=True,...optional parameters...)(outD)
#5 cells because we want a (None,10,5) vector.
</code></pre>
<p>您可以通过许多其他方式工作,例如只需创建一个50个单元格的LSTM而不返回序列,然后重新调整结果:</p>
<pre><code>alternativeOut = LSTM(50,return_sequences=False,...)(outD)
alternativeOut = Reshape((10,5))(alternativeOut)
</code></pre>
<p>我们的模式是:</p>
<pre><code>decoder = Model(inpD,outD1)
alternativeDecoder = Model(inpD,alternativeOut)
</code></pre>
<p>在那之后,你把模型和你的代码结合起来,训练自动编码器。
这三个模型都有相同的权重,因此您可以使用编码器的<code>predict</code>方法使编码器产生结果。</p>
<pre><code>encoderPredictions = encoder.predict(data)
</code></pre>
<hr/>
<p>关于生成序列的LSTMs,我经常看到的是类似于预测下一个元素的东西。</p>
<p>只取序列中的几个元素,然后尝试查找下一个元素。你又向前迈了一步,以此类推。这可能有助于生成序列。</p>