好的,所以我在https://cs.stanford.edu/people/karpathy/char-rnn/shakespear.txt上进行了有状态LSTM的训练。就准确性而言,这似乎并没有太糟糕,但是知道我想创作自己的莎士比亚作品。
问题是,我该如何实际从中生成预测?
尤其是模型批输入形状为(128、128、63),输出形状为(128、128、63)。 (第一个数字是批处理大小,第二个数字是预测输入和输出的长度,第三个数字是文本中不同字符的数量。)
例如,我想:
鉴于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)
看看其他代码示例,看来我需要以某种方式进行修改,但是我不确定具体如何。
如果有帮助,我可以包括整个代码示例。它是独立的。
答案 0 :(得分:0)
简单。使用适当的参数(请参见文档)将输入放入model.predict()
中,并连接输入和输出(该模型可以预测逐渐变长的链)。根据您组织培训的方式,输出将一次添加一个字符。更准确地说,如果将序列训练为序列移位1,则输出序列理想情况下将是输入序列移位1个元素。 PYRULEZ-> YRULEZ *因此,您需要获取输出的最后一个字符并将其添加到先前的(输入)序列中。
如果需要长行文本,则可能需要将序列的长度限制为循环中的某些字符。无论如何,文本中的许多长期依赖关系都是通过LSTM单元的有状态向量承载的(不是您要与之交互的东西)。
伪代码:
for counter in range(output_length):
output = model.predict(input_)
input_ = np.concatenate((input_, output[:,-1,:]), axis=1)