Python 在PyTorch中使用LSTM编码器、解码器对DAE进行批量培训

Python 在PyTorch中使用LSTM编码器、解码器对DAE进行批量培训,python,pytorch,autoencoder,noise,Python,Pytorch,Autoencoder,Noise,我有一个名字去噪自动编码器的代码。它接受一个名字,然后用我表示的PAD char预填充它。我这样设置它,这样我就可以进行批量训练,但在训练了几天后,我在它上面运行了一个名称,它只是打印出了pad,这是有意义的,因为它在一个字符的每一次迭代中都会支持,所以只要生成pad就可以得到奖励。我如何设置它不学习这一点?我需要填充来进行批处理训练,因为名称的长度并不一致,所以填充允许它们具有一致的长度。目前,在培训结束后,如果我输入一个名称,它只会生成pad。重复单词并用空格分隔,然后在输出上使用split

我有一个名字去噪自动编码器的代码。它接受一个名字,然后用我表示的PAD char预填充它。我这样设置它,这样我就可以进行批量训练,但在训练了几天后,我在它上面运行了一个名称,它只是打印出了pad,这是有意义的,因为它在一个字符的每一次迭代中都会支持,所以只要生成pad就可以得到奖励。我如何设置它不学习这一点?我需要填充来进行批处理训练,因为名称的长度并不一致,所以填充允许它们具有一致的长度。目前,在培训结束后,如果我输入一个名称,它只会生成pad。

重复单词并用空格分隔,然后在输出上使用
split()
,只保留第一个生成的单词。例如:“单词”。这将迫使RNN将其作为一个序列进行学习。这也意味着我必须将空格作为输出,而这在单个名称中不是有效字符。但是好主意。重复这个单词并用空格分隔,然后在输出上使用
split()
,只保留第一个生成的单词。例如:“单词”。这将迫使RNN将其作为一个序列进行学习。这也意味着我必须将空格作为输出,而这在单个名称中不是有效字符。但是好主意。
def denoise_train(x: DataLoader):
    loss = 0
    x_padded = list(map(lambda s: pad_string(s), x))
    x_idx_tensor = strings_to_index_tensor(x_padded)
    noisy_x = list(map(lambda s: noise_name(s), x))
    noisy_x_padded = list(map(lambda s: pad_string(s), noisy_x))
    noisy_x_idx_tensor = strings_to_index_tensor(noisy_x_padded)
    noisy_x_rnn_tensor = to_rnn_tensor(noisy_x_idx_tensor)
    batch_sz = len(x)
    encoder_hidden = encoder.init_hidden(batch_size=batch_sz)

    for i in range(noisy_x_rnn_tensor.shape[0]):
       _, encoder_hidden = encoder(noisy_x_rnn_tensor[i].unsqueeze(0), encoder_hidden)

    decoder_input = strings_to_tensor([SOS] * batch_sz)
    decoder_hidden = encoder_hidden
    names = [''] * batch_sz

    for i in range(x_idx_tensor.shape[0]):
        decoder_probs, decoder_hidden = decoder(decoder_input, decoder_hidden)
        nonzero_indexes = x_idx_tensor[i]
        best_indexes = torch.squeeze(torch.argmax(decoder_probs, dim=2), dim=0)
        decoder_probs = torch.squeeze(decoder_probs, dim=0)
        best_chars = list(map(lambda idx: index_to_char(int(idx)), best_indexes))
        loss += criterion(decoder_probs, nonzero_indexes.type(torch.LongTensor))

        for i, char in enumerate(best_chars):
            names[i] += char

        decoder_input = strings_to_tensor(best_chars)

    loss.backward()
    return names, noisy_x, loss.item()