def train(config): train_data, word2index, tag2index, intent2index = preprocessing( config.file_path, config.max_length) if train_data == None: print("Please check your data or its path") return encoder = Encoder(len(word2index), config.embedding_size, config.hidden_size) decoder = Decoder(len(tag2index), len(intent2index), len(tag2index) // 3, config.hidden_size * 2) if USE_CUDA: encoder = encoder.cuda() decoder = decoder.cuda() #print("來到這裏了!1!") encoder.init_weights() decoder.init_weights() #print("來到這裏了!2!") loss_function_1 = nn.CrossEntropyLoss(ignore_index=0) loss_function_2 = nn.CrossEntropyLoss() enc_optim = optim.Adam(encoder.parameters(), lr=config.learning_rate) dec_optim = optim.Adam(decoder.parameters(), lr=config.learning_rate) #print("來到這裏了!3!") for step in range(config.step_size): losses = [] for i, batch in enumerate(getBatch(config.batch_size, train_data)): x, y_1, y_2 = zip(*batch) x = torch.cat(x) tag_target = torch.cat(y_1) intent_target = torch.cat(y_2) # print("來到這裏了!4!") x_mask = torch.cat([ Variable(torch.ByteTensor(tuple(map(lambda s: s == 0, t.data)))).cuda() if USE_CUDA else Variable( torch.ByteTensor(tuple(map(lambda s: s == 0, t.data)))) for t in x ]).view(config.batch_size, -1) y_1_mask = torch.cat([ Variable(torch.ByteTensor(tuple(map(lambda s: s == 0, t.data)))).cuda() if USE_CUDA else Variable( torch.ByteTensor(tuple(map(lambda s: s == 0, t.data)))) for t in tag_target ]).view(config.batch_size, -1) # print("來到這裏了!5!") encoder.zero_grad() decoder.zero_grad() # print("來到這裏了!6!") output, hidden_c = encoder(x, x_mask) # print("來到這裏了!7!") start_decode = Variable( torch.LongTensor([ [word2index['<SOS>']] * config.batch_size ])).cuda().transpose(1, 0) if USE_CUDA else Variable( torch.LongTensor([[word2index['<SOS>']] * config.batch_size])).transpose(1, 0) # print("來到這裏了!8!") tag_score, intent_score = decoder(start_decode, hidden_c, output, x_mask) #print("來到這裏了!9!") loss_1 = loss_function_1(tag_score, tag_target.view(-1)) # print("來到這裏了!10!") loss_2 = loss_function_2(intent_score, intent_target) #print("來到這裏了!11!") loss = loss_1 + loss_2 losses.append( loss.data.cpu().numpy() if USE_CUDA else loss.data.numpy()) #print("來到這裏了!12!") loss.backward() # print("來到這裏了!13!") torch.nn.utils.clip_grad_norm(encoder.parameters(), 5.0) torch.nn.utils.clip_grad_norm(decoder.parameters(), 5.0) enc_optim.step() dec_optim.step() if i % 100 == 0: with open("result.txt", "a+") as f: #print("Step",step," epoch",i," : ",np.mean(losses)) print(f"Step是{step},epoch是{i} :均值为{np.mean(losses)}") f.write(f"Step是{step},epoch是{i} :均值为{np.mean(losses)}") f.write("\n") losses = [] if not os.path.exists(config.model_dir): os.makedirs(config.model_dir) #print("來到這裏了!5!") torch.save(decoder.state_dict(), os.path.join(config.model_dir, 'jointnlu-decoder.pkl')) torch.save(encoder.state_dict(), os.path.join(config.model_dir, 'jointnlu-encoder.pkl')) print("Train Complete!")
def train(config, encoder_in = None, decoder_in = None): train_data, word2index, tag2index, intent2index = preprocessing(config.file_path,config.max_length) if train_data==None: print("Please check your data or its path") return if encoder_in != None: encoder = encoder_in decoder = decoder_in else: encoder = Encoder(len(word2index),config.embedding_size,config.hidden_size) decoder = Decoder(len(tag2index),len(intent2index),len(tag2index)//3,config.hidden_size*2) if USE_CUDA: encoder = encoder.cuda() decoder = decoder.cuda() encoder.init_weights() decoder.init_weights() loss_function_1 = nn.CrossEntropyLoss(ignore_index=0) loss_function_2 = nn.CrossEntropyLoss() enc_optim= optim.Adam(encoder.parameters(), lr=config.learning_rate) dec_optim = optim.Adam(decoder.parameters(),lr=config.learning_rate) for step in range(config.step_size): losses=[] for i, batch in enumerate(getBatch(config.batch_size,train_data)): x,y_1,y_2 = zip(*batch) # sin,sout,intent x = torch.cat(x) tag_target = torch.cat(y_1) intent_target = torch.cat(y_2) x_mask = torch.cat([Variable(torch.ByteTensor(tuple(map(lambda s: s ==0, t.data)))).cuda() if USE_CUDA else Variable(torch.ByteTensor(tuple(map(lambda s: s ==0, t.data)))) for t in x]).view(config.batch_size,-1) y_1_mask = torch.cat([Variable(torch.ByteTensor(tuple(map(lambda s: s ==0, t.data)))).cuda() if USE_CUDA else Variable(torch.ByteTensor(tuple(map(lambda s: s ==0, t.data)))) for t in tag_target]).view(config.batch_size,-1) encoder.zero_grad() decoder.zero_grad() output, hidden_c = encoder(x,x_mask) start_decode = Variable(torch.LongTensor([[word2index['<SOS>']]*config.batch_size])).cuda().transpose(1,0) if USE_CUDA else Variable(torch.LongTensor([[word2index['<SOS>']]*config.batch_size])).transpose(1,0) tag_score, intent_score = decoder(start_decode,hidden_c,output,x_mask) loss_1 = loss_function_1(tag_score,tag_target.view(-1)) loss_2 = loss_function_2(intent_score,intent_target) loss = loss_1+loss_2 losses.append(loss.data.cpu().numpy() if USE_CUDA else loss.data.numpy()) loss.backward() torch.nn.utils.clip_grad_norm(encoder.parameters(), 5.0) torch.nn.utils.clip_grad_norm(decoder.parameters(), 5.0) enc_optim.step() dec_optim.step() if i % 100==0: print("Step",step," epoch",i," : ",np.mean(losses)) losses=[] t = Check() t.test(encoder,decoder) count = t.test_error_count rate = t.test_error_rate if not os.path.exists(config.model_dir): os.makedirs(config.model_dir) torch.save(decoder, os.path.join(config.model_dir, str(count)+'_'+str(rate)+'_'+'decoder.pkl')) torch.save(encoder, os.path.join(config.model_dir, str(count)+'_'+str(rate)+'_'+'encoder.pkl')) # if not os.path.exists(config.model_dir): # os.makedirs(config.model_dir) # torch.save(decoder.state_dict(),os.path.join(config.model_dir,'jointnlu-decoder.pkl')) # torch.save(encoder.state_dict(),os.path.join(config.model_dir, 'jointnlu-encoder.pkl')) # torch.save(decoder,os.path.join(config.model_dir,'jointnlu-decoder.pkl')) # torch.save(encoder,os.path.join(config.model_dir, 'jointnlu-encoder.pkl')) print("Train Complete!")
def train(config): data_loader = DataLoader(config.file_path, config.max_length, config.batch_size) train_data, word2index, tag2index, intent2index = data_loader.load_train() if train_data is None: print("Please check your data or its path") return encoder = Encoder(len(word2index), config.embedding_size, config.hidden_size) decoder = Decoder(len(tag2index), len(intent2index), config.hidden_size * 2) if USE_CUDA: encoder = encoder.cuda() decoder = decoder.cuda() encoder.init_weights() decoder.init_weights() loss_function_1 = nn.CrossEntropyLoss(ignore_index=0) loss_function_2 = nn.CrossEntropyLoss() enc_optim = optim.Adam(encoder.parameters(), lr=config.learning_rate) dec_optim = optim.Adam(decoder.parameters(), lr=config.learning_rate) for step in range(config.step_size): losses = [] for i, batch in enumerate(data_loader.get_batch(train_data)): x, embedding_x, y_1, y_2 = zip(*batch) x = torch.cat(x) embedding_x = torch.cat(embedding_x) tag_target = torch.cat(y_1) intent_target = torch.cat(y_2) x_mask = torch.cat([ Variable(torch.ByteTensor(tuple(map(lambda s: s == 0, t.data)))).cuda() if USE_CUDA else Variable( torch.ByteTensor(tuple(map(lambda s: s == 0, t.data)))) for t in x ]).view(len(batch), -1) encoder.zero_grad() decoder.zero_grad() output, hidden_c = encoder(x, embedding_x, x_mask) start_decode = Variable( torch.LongTensor( [[word2index['<SOS>']] * len(batch)])).cuda().transpose( 1, 0) if USE_CUDA else Variable( torch.LongTensor([[word2index['<SOS>']] * len(batch)])).transpose(1, 0) tag_score, intent_score = decoder(start_decode, hidden_c, output, x_mask) loss_1 = loss_function_1(tag_score, tag_target.view(-1)) loss_2 = loss_function_2(intent_score, intent_target) loss = loss_1 + loss_2 losses.append( loss.data.cpu().numpy() if USE_CUDA else loss.data.numpy()) loss.backward() torch.nn.utils.clip_grad_norm(encoder.parameters(), 5.0) torch.nn.utils.clip_grad_norm(decoder.parameters(), 5.0) enc_optim.step() dec_optim.step() if i % 100 == 0: print("Step", step, " : ", np.mean(losses)) losses = [] if not os.path.exists(config.model_dir): os.makedirs(config.model_dir) torch.save(encoder, os.path.join(config.model_dir, 'jointnlu-encoder.pt')) torch.save(decoder, os.path.join(config.model_dir, 'jointnlu-decoder.pt')) print("Training Complete!")