更新:生成新字符的逻辑错误。见下面的答案。
原始问题:我使用Pytorch构建了一个用于生成字符级文本的LSTM。该模型训练良好(损失合理减少等),但训练有素的模型最终输出一遍又一遍重复输入的最后一小撮词(例如输入:“她告诉她稍后回来,但她从未做过”;输出:“,但她从未这样做,但她从未这样做,但她从未这样做过”等等。
我已经玩了一些超参数,问题仍然存在。我目前正在使用:
我也尝试过并不总是选择最佳选择,但这只会引入错误的单词并且不会破坏循环。我一直在看无数的教程,我无法弄清楚我在做什么不同/错误。
以下是培训模型的代码。 training_data
是一个长字符串,我循环它预测长度为SEQ_LEN
的每个子字符串的下一个字符。我不确定我的错误是在这里还是其他地方,但任何评论或指示都非常感谢!
loss_dict = dict()
for e in range(EPOCHS):
print("------ EPOCH {} OF {} ------".format(e+1, EPOCHS))
lstm.reset_cell()
for i in range(0, DATA_LEN, BATCH_SIZE):
if i % 50000 == 0:
print(i/float(DATA_LEN))
optimizer.zero_grad()
input_vector = torch.tensor([[
vocab.get(char, len(vocab))
for char in training_data[i+b:i+b+SEQ_LEN]
] for b in range(BATCH_SIZE)])
if USE_CUDA and torch.cuda.is_available():
input_vector = input_vector.cuda()
output_vector = lstm(input_vector)
target_vector = torch.zeros(output_vector.shape)
if USE_CUDA and torch.cuda.is_available():
target_vector = target_vector.cuda()
for b in range(BATCH_SIZE):
target_vector[b][vocab.get(training_data[i+b+SEQ_LEN])] = 1
error = loss(output_vector, target_vector)
error.backward()
optimizer.step()
loss_dict[(e, int(i/BATCH_SIZE))] = error.detach().item()
答案:在使用经过训练的模型制作角色时我犯了一个愚蠢的错误:我对批量大小感到困惑,并假设网络会在每一步预测整批新角色,而事实上它只预测一个...这就是为什么它只是重复输入的结束。哎呀!
无论如何,如果你遇到这个问题,请仔细检查你是否有正确的逻辑来生成具有训练模型的新输出(特别是如果你正在使用批次)。如果不是这样并且问题仍然存在,您可以尝试微调以下内容: