【问题标题】:How do you make predictions with a stateful LSTM?你如何使用有状态的 LSTM 进行预测?
【发布时间】:2018-09-16 14:53:26
【问题描述】:

好的,所以我在https://cs.stanford.edu/people/karpathy/char-rnn/shakespear.txt 上训练了一个有状态的 LSTM。它在准确性方面似乎并不算太​​差,但我知道我想创作自己的莎士比亚作品。

问题是,我该如何从它实际生成预测?

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

例如,我想:

  • 从空文本开始生成各种预测
  • 从小的起始文本(例如“PYRULEZ:”)开始生成预测

考虑到 LSTM 的工作原理,这应该是可能的。

这是用于生成和拟合模型的代码的 sn-p:

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)

查看其他代码示例,我似乎需要以某种方式对其进行修改,但我不确定具体如何。

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

【问题讨论】:

    标签: python tensorflow keras lstm prediction


    【解决方案1】:

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

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

    伪代码:

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

    【讨论】:

    • 我没有看到允许您输入小于输入大小的输入的预测选项。
    • @PyRulez 将您的批量输入形状更改为 [128, None, dataXshape[2]] 以具有可变输入长度。
    猜你喜欢
    • 2021-04-14
    • 2019-04-10
    • 2020-08-24
    • 2018-09-24
    • 2018-03-14
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多