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()
У меня есть этот код для шумоподавляющего автоэнкодера на имена. Он берет имя, а затем дополняет его PAD char, который я обозначаю. Я настроил его таким образом, чтобы я мог проводить пакетное обучение, но после обучения в течение пары дней я проверил имя по нему, и оно просто распечатало пэды, что имеет смысл, потому что он поддерживает каждую итерацию символа, так что вознаграждается только за создание колодок. Как мне настроить это, чтобы не учить это? Мне нужно заполнение для пакетного обучения, потому что имена не имеют одинаковую длину, поэтому заполнение позволяет им иметь одинаковую длину. В настоящее время, прямо после тренировки, если я произнесу имя, оно просто генерирует пэды.