用于文本生成的Keras LSTM不断重复一行或一个序列



我大致遵循了本教程:

https://machinelearningmastery.com/text-generation-lstm-recurrent-neural-networks-python-keras/

一个显著的区别是,我使用了2个具有丢弃的LSTM层。我的数据集不同(以abc表示法的音乐数据集)。我确实生成了一些歌曲,但在生成过程中经过一定数量的步骤(可能从30步到几百步)后,LSTM会一次又一次地生成完全相同的序列。例如,它曾经被困在为歌曲生成URL上:

F:http://www.youtube.com/watch?v=JPtqU6pipQI

等等。。。

它还一度陷入了生成相同的两首歌曲的困境(这两首歌曲是一个大约300个字符的序列)。一开始,它创作了3-4首好歌,但后来,它几乎无限期地重新创作了这两首歌。

我想知道,有人对可能发生的事情有一些了解吗

我想澄清的是,任何生成的序列,无论是重复的还是不重复的,似乎都是新的(模型不记忆)。验证损失和培训损失按预期减少。Andrej Karpathy能够生成一个包含数千个字符的文档,但我找不到这种无限期陷入困境的模式。

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

与其在预测输出中使用argmax,不如尝试使用以下内容引入一些随机性:

np.argmax(prediction_output)[0])

np.random.choice(len(prediction_output), p=prediction_output)

我一直在这个重复序列问题上挣扎了一段时间,直到我发现了这个Colab笔记本,在那里我明白了为什么他们的模型能够生成一些非常好的样本:https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/shakespeare_with_tpu_and_keras.ipynb#scrollTo=tU7M-EGGxR3E

在我更改了这一行之后,我的模型从一次又一次地生成几个单词变成了真正有趣的东西!

要使用和训练文本生成模型,请执行以下步骤:

  1. 从模型中提取下一个字符的概率分布,给定到目前为止可用的文本(这将是我们的预测分数)
  2. 将分布重新加权到特定的"温度"(请参阅下面的代码)
  3. 根据重新加权的分布随机采样下一个字符(参见下面的代码)
  4. 在可用文本的末尾添加新字符

查看示例函数:

def sample(preds, temperature=1.0):
preds = np.asarray(preds).astype('float64')
preds = np.log(preds) / temperature
exp_preds = np.exp(preds)
preds = exp_preds / np.sum(exp_preds)
probas = np.random.multinomial(1, preds, 1)
return np.argmax(probas)

您应该在培训期间使用示例功能,如下所示:

for epoch in range(1, 60):
print('epoch', epoch)
# Fit the model for 1 epoch on the available training data
model.fit(x, y,
batch_size=128,
epochs=1)
# Select a text seed at random
start_index = random.randint(0, len(text) - maxlen - 1)
generated_text = text[start_index: start_index + maxlen]
print('--- Generating with seed: "' + generated_text + '"')
for temperature in [0.2, 0.5, 1.0, 1.2]:
print('------ temperature:', temperature)
sys.stdout.write(generated_text)
# We generate 400 characters
for i in range(400):
sampled = np.zeros((1, maxlen, len(chars)))
for t, char in enumerate(generated_text):
sampled[0, t, char_indices[char]] = 1.
preds = model.predict(sampled, verbose=0)[0]
next_index = sample(preds, temperature)
next_char = chars[next_index]
generated_text += next_char
generated_text = generated_text[1:]
sys.stdout.write(next_char)
sys.stdout.flush()
print()

低温会导致文本极度重复和可预测,但局部结构非常逼真:特别是,所有单词(一个单词是局部字符模式)都是真正的英语单词。随着温度的升高,生成的文本变得更加有趣、令人惊讶,甚至更有创意。

查看此笔记本

最新更新