Pytorch LSTM文本生成器重复相同的单词

问题描述 投票:0回答:1

更新:生成新字符的逻辑错误。见下面的答案。

原始问题:我使用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()
deep-learning lstm pytorch
1个回答
0
投票

答案:在使用经过训练的模型制作角色时我犯了一个愚蠢的错误:我对批量大小感到困惑,并假设网络会在每一步预测整批新角色,而事实上它只预测一个...这就是为什么它只是重复输入的结束。哎呀!

无论如何,如果你遇到这个问题,请仔细检查你是否有正确的逻辑来生成具有训练模型的新输出(特别是如果你正在使用批次)。如果不是这样并且问题仍然存在,您可以尝试微调以下内容:

  • 序列长度
  • 贪婪(例如,概率选择与下一个角色的首选)
  • 批量大小
  • 时代
© www.soinside.com 2019 - 2024. All rights reserved.