Python 如何使用有状态LSTM进行预测?

Python 如何使用有状态LSTM进行预测?,python,tensorflow,keras,lstm,prediction,Python,Tensorflow,Keras,Lstm,Prediction,好的,所以我训练了一个有状态的LSTM角色。就准确性而言,它似乎做得不太差,但我知道我想创作自己的莎士比亚作品 问题是,我如何从中实际生成预测 特别是,模型批输入形状为(128、128、63),输出形状为(128、128、63)。(第一个数字是批量大小,第二个数字是预测输入和输出的长度,第三个数字是文本中不同字符的数量。) 例如,我想: 从空文本开始生成各种预测 从小的起始文本(例如“PYRULEZ:”)开始生成预测 考虑到LSTM的工作方式,这应该是可能的 以下是用于生成和拟合模型的代码片

好的,所以我训练了一个有状态的LSTM角色。就准确性而言,它似乎做得不太差,但我知道我想创作自己的莎士比亚作品

问题是,我如何从中实际生成预测

特别是,模型批输入形状为(128、128、63),输出形状为(128、128、63)。(第一个数字是批量大小,第二个数字是预测输入和输出的长度,第三个数字是文本中不同字符的数量。)

例如,我想:

  • 从空文本开始生成各种预测
  • 从小的起始文本(例如“PYRULEZ:”)开始生成预测
考虑到LSTM的工作方式,这应该是可能的

以下是用于生成和拟合模型的代码片段:

model = Sequential()
model.add(LSTM(dataY.shape[2], batch_input_shape=(128, dataX.shape[1], dataX.shape[2]), return_sequences = True, stateful=True, activation = "softmax"))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['acc'])
model.fit(dataX, dataY, epochs = 1, batch_size = 128, verbose=1, shuffle = False)
看看其他代码示例,我似乎需要以某种方式修改它,但我不确定具体修改的方式


如果有帮助的话,我可以包括整个代码示例。它是独立的。

简单。将您的输入放入带有适当参数的
model.predict()
(参见文档),连接输入和输出(模型预测的链逐渐变长)。根据您组织培训的方式,输出将一次添加一个角色。更准确地说,如果你训练一个序列一个序列移位,你的输出序列将理想地成为你的输入序列移位一个元素;PYRULEZ->YRULEZ*因此您需要获取输出的最后一个字符,并将其添加到先前的(输入)序列中

如果需要长行文本,可能需要将序列长度限制为循环中的某些字符数。文本中的许多长期依赖关系都是通过LSTM单元的状态向量进行的(不是与之交互的东西)

伪代码ish:

for counter in range(output_length):
    output = model.predict(input_)
    input_ = np.concatenate((input_, output[:,-1,:]), axis=1)

我看不到predict的选项允许您输入小于输入大小的输入。@PyRulez将批输入形状更改为
[128,None,dataXshape[2]]
以具有可变输入长度。