def decode(model, opts, test_batcher, i2c, i2p): """ Decode the input """ logging.basicConfig(filename=opts.log, level=logging.INFO) if opts.use_cuda: #print "Find GPU enable, using GPU to compute..." model.cuda() torch.cuda.manual_seed(opts.seed) # else: # print "Find GPU unable, using CPU to compute..." result_file = opts.result_file result_writer = codecs.open(result_file, 'w', 'utf-8') t = trange(opts.data_size, desc='DECODE') for iter in t: input, target, pos, target_length, input_length = test_batcher.next() input_tensor = Variable(torch.LongTensor(input)) target_tensor = Variable(torch.LongTensor(target)) pos_tensor = Variable(torch.LongTensor(pos)) if opts.use_cuda: input_tensor = input_tensor.cuda() target_tensor = target_tensor.cuda() pos_tensor = pos_tensor.cuda() encoder_state, encoder_output, pos_feature, _ = model.encode_once( input_tensor, pos_tensor) start_decode = Variable(torch.LongTensor([2])).cuda().unsqueeze(1) beam = Beam(model, opts.beam_size, opts.max_target_len, encoder_state, encoder_output, pos_feature, start_decode, input) hyper = beam.run() raw_input = "" result = "" raw_pos = "" for word in hyper.word_list: result += i2c[word] for word in input[0]: raw_input += i2c[word] for word in pos[0]: if word == 0: break raw_pos += i2p[word] + ";" raw_pos = raw_pos[:-1] result_writer.write(raw_input + '\t' + result + '\t' + raw_pos + '\n') result_writer.close() os.system(('../evaluation/evalm.py --gold %s --guess %s --task 1') % (opts.test, opts.result_file)) log_result('temp.txt', opts)