Keras的LSTM是否真的考虑了单元状态和先前的输出?

时间:2019-06-10 03:25:24

标签: python tensorflow keras lstm

过去一天,我了解了LSTM,然后决定看一下使用Keras创建它的教程。我看了几本教程,它们都有

的派生词。
model = Sequential()
model.add(LSTM(10, input_shape=(1,1)))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='adam')
X,y = get_train()
model.fit(X, y, epochs=300, shuffle=False, verbose=0)

然后他们预测使用

 model.predict(X, verbose=0)

我的问题是:为了使用LSTM预测下一个结果,您是否不必给出先前的预测以及输入和单元状态? 另外,这10个在model.add(LSTM(10, input_shape(1,1))中代表什么?

3 个答案:

答案 0 :(得分:1)

您必须将先前的预测赋予LSTM状态。如果您调用预测LSTM每次都会初始化,它将不会记住先前预测的状态。

通常情况下(例如,如果您使用lstm生成文本),您会在循环中执行以下操作:

# pick a random seed
start = numpy.random.randint(0, len(dataX)-1)
pattern = dataX[start]
print "Seed:"
print "\"", ''.join([int_to_char[value] for value in pattern]), "\""
# generate characters
for i in range(1000):
    x = numpy.reshape(pattern, (1, len(pattern), 1))
    x = x / float(n_vocab)
    prediction = model.predict(x, verbose=0)
    index = numpy.argmax(prediction)
    result = int_to_char[index]
    seq_in = [int_to_char[value] for value in pattern]
    sys.stdout.write(result)
    pattern.append(index)
    pattern = pattern[1:len(pattern)]
print "\nDone."

(示例从machinelearningmastery.com复制)

重要的是以下几行:

pattern.append(index)
pattern = pattern[1:len(pattern)]

在这里,他们将下一个字符附加到模式,然后删除第一个字符,使其输入长度与lstm的期望值匹配。然后将其带入numpy数组(x = np.reshape(...)),并根据生成的输出从模型进行预测。因此,要回答第一个问题,您需要再次输入输出。

对于第二个问题,10对应于您在一个图层中拥有的lstm单元数。如果您不使用“ return_sequences = True”,则它对应于该图层的输出大小。

答案 1 :(得分:0)

您的第一个问题:

  

为了使用LSTM预测下一个结果,是否不必给出先前的预测以及输入和单元状态?

不,您不必这样做。据我了解,它存储在LSTM单元中,这就是LSTM使用大量RAM的原因

如果您的数据具有如下所示的形状:

(100,1000)

如果将其插入fit函数,则每个时期将运行100个列表。当移动到下一个列表时,LSTM将在刷新之前记住1000个数据图。

第二:

  

另外,10在model.add(LSTM(10,input_shape(1,1)))中代表什么?

它是输入后第一层的形状,因此您的模型当前具有以下形状:

1,1 10 1

希望它会有所帮助:)

答案 2 :(得分:0)

让我们将其分解成图片并以图形方式显示

LSTM(10, input_shape=(3,1))):定义序列长度为3的LSTM,即LSTM将展开3个时间步长。 LSTM在每个时间步上都会输入大小为1的输入。输出(以及隐藏状态和所有其他LSTM门的大小)为10(向量或大小为10)

![enter image description here

您不必手动进行展开(从当前的隐藏状态传递到下一个状态),这由keras / tensorflow LSTM层负责。您要做的就是以(batch_size X time_steps X input_size)格式传递数据。

Dense(1, activation='linear'):这是一个具有线性激活功能的密集层,以上一层的输出(即LSTM的输出为最后展开的10的矢量)作为输入。它将返回一个大小为1的向量。

enter image description here

可以使用model.summary()

进行检查