print_loss_total += loss plot_loss_total += loss if iter % print_every == 0: print_loss_avg = print_loss_total / print_every print_loss_total = 0 print('%s (%d %d%%) %.4f' % (timeSince(start, iter / n_iters), iter, iter / n_iters * 100, print_loss_avg)) if iter % plot_every == 0: plot_loss_avg = plot_loss_total/plot_every plot_losses.append(plot_loss_avg) plot_loss_total = 0 showPlot(plot_losses) plt.savefig('base-lstm-loss') torch.save(encoder.state_dict(), 'encoder.pth') torch.save(decoder.state_dict(), 'decoder.pth') if __name__ == "__main__": hidden_size = 256 n_iters = 910000 teacher_forcing_ratio = 0.5 input_lang, output_lang, pairs = loader.prepareData('eng', 'fra', True) encoder = seq2seq.Encoder(input_lang.n_words, hidden_size).to(device) decoder = seq2seq.Decoder(hidden_size, output_lang.n_words).to(device) trainiters(encoder, decoder, n_iters)
translate(pair, output_sentence) ref = pair[1].split() hyp = output_words scores.append(sentence_bleu([ref], hyp, smoothing_function = cc.method3) * 100.) print("BLEU: {:.4}".format(sum(scores)/len(test_pairs))) if __name__ == "__main__": """ Evaluation is mostly the same as training, but there are no targets so we simply feed the decoder's predictions back to itself for each step. Every time it predict a word, we add it to the output string and if it predicts the EOS token we step there. """ config = argparser() input_lang, output_lang, pairs = loader.prepareData(config.srcLang, config.tgtLang, True) encoder = seq2seq.LSTMEncoder(input_size = input_lang.n_words, embedding_size \ = config.embedding_size, hidden_size = config.hidden_size).to(device) decoder = seq2seq.LSTMDecoder(output_size = output_lang.n_words, embedding_size \ = config.embedding_size, hidden_size = config.hidden_size).to(device) encoder.load_state_dict(torch.load(config.encoder)) encoder.eval() decoder.load_state_dict(torch.load(config.decoder)) decoder.eval() evaluateiters(pairs, encoder, decoder)