使用 LSTM/RNN 预测数字序列

Posted

技术标签:

【中文标题】使用 LSTM/RNN 预测数字序列【英文标题】:Using LSTM/RNN to predict a sequence of numbers 【发布时间】:2021-11-03 15:33:14 【问题描述】:

我希望将 RNN 应用于一个相当简单的问题,以便掌握它的工作原理。我关注了this example,它演示了如何使用 LSTM 层来分析输入,现在我想将它用于输出。

我决定尝试训练一个 RNN 以输出作为输入的 int 的双精度值,直至达到上限。因此,例如,使用此数据:

def doubles(b,cap): 
    seq = [b]
    if b<=0 :
        raise ValueError('Base int must be greater than zero.')
    i = 1
    while seq[-1]<cap:
        seq.append(b*2**i)
        i +=1
    return seq

maxsize = -1
cap = 100
nums = [2,3,4,6,7,8,9,10,11,12]
doubles = []
for base in nums:
    myseq = doubles(base, cap)
    doubles.append(myseq)
    if len(myseq)>=maxsize:
        maxsize = len(myseq) +1

for s in doubles:
    while len(s)<maxsize:
        s.append(-1)
    print(s)


[2, 4, 8, 16, 32, 64, 128, -1]
[3, 6, 12, 24, 48, 96, 192, -1]
[4, 8, 16, 32, 64, 128, -1, -1]
[6, 12, 24, 48, 96, 192, -1, -1]
[7, 14, 28, 56, 112, -1, -1, -1]
[8, 16, 32, 64, 128, -1, -1, -1]
[9, 18, 36, 72, 144, -1, -1, -1]
[10, 20, 40, 80, 160, -1, -1, -1]
[11, 22, 44, 88, 176, -1, -1, -1]
[12, 24, 48, 96, 192, -1, -1, -1]

我想创建一个以nums 作为输入并输出相应序列的 keras 模型,使用 -1 作为“停止”指示符,因为我只想输出数字。

我尝试过创建这样的模型:

mymodel = Sequential()

mymodel.add(Input(shape=(4,)))
mymodel.add(Dense(32))
mymodel.add(LSTM(64))

但它会引发此错误:

ValueError                                Traceback (most recent call last)
<ipython-input-30-24845ffeabd5> in <module>
      3 mymodel.add(Input(shape=(1,)))
      4 mymodel.add(Dense(32))
----> 5 mymodel.add(LSTM(64))
(...)
ValueError: Input 0 of layer lstm_2 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (None, 32)

它需要哪些额外的维度?我是否因为想要输出“时间序列”而错误地使用了这些层?

【问题讨论】:

2 快速的事情:1) 在错误消息中,看起来你给了它Input(shape=(1,)),而在代码中我看到Input(shape=(4,))。它是哪一个? 2)您能否提供一个最小的可重现示例,以便我可以提供更好的帮助? ***.com/help/minimal-reproducible-example @TCArlen 修复了错误并添加了导入,因此可以重现。错误发生在mymodel 块中,实际上并没有其他问题。 谢谢。它对我来说仍然无法重现,因为没有定义 almost_doubles() 函数 @TCArlen 我的错,我将两个版本融合在一起并错过了那个错误。现在应该好了 【参考方案1】:

设法找出我的问题。我需要在我的模型中添加一个RepeatVector() 层来正确集成 LSTM 部分。我的模型结构现在如下所示:

mymodel = Sequential()

mymodel.add(Input(shape=(1,)))
mymodel.add(Dense(8))
mymodel.add(RepeatVector(8))
mymodel.add(LSTM(8, activation="relu"))

mymodel.compile(loss="MSE", optimizer="adam")
history = mymodel.fit(numpy.array(nums), numpy.array(mydoubles), epochs=4000, verbose=0)

我仍在摆弄激活函数和优化器,因为我有一些梯度消失的问题,但这是另一篇文章的问题。

【讨论】:

以上是关于使用 LSTM/RNN 预测数字序列的主要内容,如果未能解决你的问题,请参考以下文章

循环神经网络LSTM RNN回归:sin曲线预测

循环神经网络LSTM RNN回归:sin曲线预测

LSTM RNN 同时预测多个时间步长和多个特征

为啥神经网络在自己的训练数据上预测错误?

使用带有 LSTM 的预训练 word2vec 进行单词生成

Tensorflow - Tutorial : 利用 RNN/LSTM 进行手写数字识别