def train(model, train_loader, dev_loader, optimizer, scheduler, max_epoch, model_dir, encoder, gpu_mode, eval_frequency=500): model.train() train_loss = 0 total_steps = 0 print_freq = 50 dev_score_list = [] top1 = imsitu_scorer(encoder, 1, 3) top5 = imsitu_scorer(encoder, 5, 3) '''print('init param data check :') for f in model.parameters(): if f.requires_grad: print(f.data.size())''' for epoch in range(max_epoch): #print('current sample : ', i, img.size(), verb.size(), roles.size(), labels.size()) #sizes batch_size*3*height*width, batch*504*1, batch*6*190*1, batch*3*6*lebale_count*1 mx = len(train_loader) for i, (img, verb, roles, labels) in enumerate(train_loader): #print("epoch{}-{}/{} batches\r".format(epoch,i+1,mx)) , total_steps += 1 if gpu_mode >= 0: img = torch.autograd.Variable(img.cuda()) roles = torch.autograd.Variable(roles.cuda()) verb = torch.autograd.Variable(verb.cuda()) labels = torch.autograd.Variable(labels.cuda()) else: img = torch.autograd.Variable(img) verb = torch.autograd.Variable(verb) roles = torch.autograd.Variable(roles) labels = torch.autograd.Variable(labels) optimizer.zero_grad() verb_predict, role_predict, norm, verb_marginal, best_role_ids = model( img, verb, roles) loss = model.calculate_loss(verb_predict, verb, norm, role_predict, labels) loss.backward() optimizer.step() '''print('grad check :') for f in model.parameters(): print('data is') print(f.data) print('grad is') print(f.grad)''' train_loss += loss.item() top1.add_point(verb_marginal, verb, best_role_ids, labels, roles) top5.add_point(verb_marginal, verb, best_role_ids, labels, roles) if total_steps % print_freq == 0: top1_a = top1.get_average_results() top5_a = top5.get_average_results() print("{},{},{}, {} , {}, loss = {:.2f}, avg loss = {:.2f}". format(total_steps - 1, epoch, i, utils.format_dict(top1_a, "{:.2f}", "1-"), utils.format_dict(top5_a, "{:.2f}", "5-"), loss.item(), train_loss / ((total_steps - 1) % eval_frequency))) if total_steps % eval_frequency == 0: top1, top5, val_loss = eval(model, dev_loader, encoder, gpu_mode) model.train() top1_avg = top1.get_average_results() top5_avg = top5.get_average_results() avg_score = top1_avg["verb"] + top1_avg["value"] + top1_avg["value-all"] + top5_avg["verb"] + \ top5_avg["value"] + top5_avg["value-all"] + top5_avg["value*"] + top5_avg["value-all*"] avg_score /= 8 print('Dev {} average :{:.2f} {} {}'.format( total_steps - 1, avg_score * 100, utils.format_dict(top1_avg, '{:.2f}', '1-'), utils.format_dict(top5_avg, '{:.2f}', '5-'))) print('Dev loss :', val_loss) dev_score_list.append(avg_score) max_score = max(dev_score_list) if max_score == dev_score_list[-1]: checkpoint_name = os.path.join( model_dir, '{}_devloss_cnngraph_{}.h5'.format( 'baseline', len(dev_score_list))) utils.save_net(checkpoint_name, model) print('New best model saved! {0}'.format(max_score)) print('current train loss', train_loss) train_loss = 0 top1 = imsitu_scorer(encoder, 1, 3) top5 = imsitu_scorer(encoder, 5, 3) del verb_predict, role_predict, loss, img, verb, roles, labels #break scheduler.step() print('Epoch ', epoch, ' completed!')
def train(model, train_loader, dev_loader, optimizer, max_epoch, model_dir, encoder, gpu_mode, eval_frequency=500): model.train() train_loss = 0 total_steps = 0 print_freq = 50 dev_loss_list = [] top1 = imsitu_scorer(encoder, 1, 3) top5 = imsitu_scorer(encoder, 5, 3) '''print('init param data check :') for f in model.parameters(): print('init data and size') print(f.data) print(f.data.size())''' for epoch in range(max_epoch): #print('current sample : ', i, img.size(), verb.size(), roles.size(), labels.size()) #sizes batch_size*3*height*width, batch*504*1, batch*6*190*1, batch*3*6*lebale_count*1 for i, (img, verb, roles, labels) in enumerate(train_loader): total_steps += 1 if gpu_mode >= 0: img = torch.autograd.Variable(img.cuda()) roles = torch.autograd.Variable(roles.cuda()) verb = torch.autograd.Variable(verb.cuda()) labels = torch.autograd.Variable(labels.cuda()) else: img = torch.autograd.Variable(img) verb = torch.autograd.Variable(verb) roles = torch.autograd.Variable(roles) labels = torch.autograd.Variable(labels) verb_predict, role_predict = model(img, verb, roles) loss = model.calculate_loss(verb_predict, verb, role_predict, labels) #print('current batch loss = ', loss) optimizer.zero_grad() loss.backward() optimizer.step() '''print('grad check :') for f in model.parameters(): print('data is') print(f.data) print('grad is') print(f.grad)''' train_loss += loss.data target = torch.max(verb, 1)[1] #get correct roles for each gt verb from roles pred target_role_encoding = encoder.get_role_encoding(target) role_pred_for_target = torch.bmm(target_role_encoding, role_predict) top1.add_point(verb_predict, verb, role_pred_for_target, labels) top5.add_point(verb_predict, verb, role_pred_for_target, labels) if total_steps % print_freq == 0: top1_a = top1.get_average_results() top5_a = top5.get_average_results() print("{},{},{}, {} , {}, loss = {:.2f}, avg loss = {:.2f}". format(total_steps - 1, epoch, i, utils.format_dict(top1_a, "{:.2f}", "1-"), utils.format_dict(top5_a, "{:.2f}", "5-"), loss.data[0], train_loss / ((total_steps - 1) % eval_frequency))) if total_steps % eval_frequency == 0: top1, top5, dev_loss = eval(model, dev_loader, encoder, gpu_mode) model.train() top1_avg = top1.get_average_results() top5_avg = top5.get_average_results() avg_score = top1_avg["verb"] + top1_avg["value"] + top1_avg["value-all"] + top5_avg["verb"] + \ top5_avg["value"] + top5_avg["value-all"] + top5_avg["value*"] + top5_avg["value-all*"] avg_score /= 8 print('Dev {} average :{:.2f} {} {}'.format( total_steps - 1, avg_score * 100, utils.format_dict(top1_avg, '{:.2f}', '1-'), utils.format_dict(top5_avg, '{:.2f}', '5-'))) dev_loss_list.append(dev_loss) min_loss = min(dev_loss_list) if min_loss == dev_loss_list[-1]: checkpoint_name = os.path.join( model_dir, '{}_devloss_{}.h5'.format('baseline', len(dev_loss_list))) utils.save_net(checkpoint_name, model) print('New best model saved! {0}'.format(min_loss)) print('current train loss', train_loss) train_loss = 0 print('Epoch ', epoch, ' completed!')