使用 LSTM/RNN 预测数字序列
Using LSTM/RNN to predict a sequence of numbers
我希望将 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]
我想创建一个 keras 模型,它以 nums
作为输入并输出相应的序列,使用 -1
作为 'STOP' 指标,因为我正在寻找输出只有数字。
我试过创建这样的模型:
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)
它需要哪些额外的维度?我是否错误地使用了这些层来输出“时间序列”?
设法解决了我的问题。我的模型中需要一个 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)
我仍然在摆弄激活函数和优化器,因为我有一些消失的梯度问题,但这是另一个问题 post。
我希望将 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]
我想创建一个 keras 模型,它以 nums
作为输入并输出相应的序列,使用 -1
作为 'STOP' 指标,因为我正在寻找输出只有数字。
我试过创建这样的模型:
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)
它需要哪些额外的维度?我是否错误地使用了这些层来输出“时间序列”?
设法解决了我的问题。我的模型中需要一个 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)
我仍然在摆弄激活函数和优化器,因为我有一些消失的梯度问题,但这是另一个问题 post。