更新:生成新字符的逻辑是错误的。请参阅下面的答案。
原始问题:我用Pytorch构建了一个LSTM来生成字符级文本。该模型训练得很好(损失合理减少等),但是经过训练的模型最终输出了输入的最后几个单词,一遍又一遍地重复(例如,输入:“她告诉她以后再来,但是她从没来过”);输出:“,但是她从没做过,但是她从未做过,但是她从未做过”等等。
我已经使用了一些超参数,但问题仍然存在。我当前正在使用:
丢失功能:BCE
优化器:亚当
学习率:0.001
序列长度:64
批量大小:32
嵌入暗号:128
隐藏的暗淡:512
LSTM层:2
我也尝试不总是选择最佳选择,但这只会引入错误的单词,并且不会中断循环。我一直在看无数的教程,但我不太清楚自己在做什么与众不同/错误。
以下是训练模型的代码。 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()
答案 0 :(得分:0)
答案:我在使用经过训练的模型制作角色时犯了一个愚蠢的错误:我对批量大小感到困惑,并假设网络在每一步都将预测整批新角色,而实际上它只能预测一个新角色。单个…这就是为什么它只是重复输入的末尾。 kes!
无论如何,如果遇到此问题,请仔细检查一下,您是否具有使用经过训练的模型生成新输出的正确逻辑(尤其是在使用批处理时)。如果不是那样,并且问题仍然存在,则可以尝试对以下内容进行微调:
序列长度
贪婪(例如,概率选择与下一个字符的首选)
批量大小
时代