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