def pruning_process(model): print("------------------------- Before pruning --------------------------------") criterion = nn.CrossEntropyLoss().cuda() accuracy = util.validate(args, test_loader, model, criterion) print("------------------------- pruning --------------------------------------") if args.model_mode == 'c' or args.model_mode =='a': model.prune_by_percentile( ['conv1'], q=100-58.0) model.prune_by_percentile( ['conv2'], q=100-22.0) model.prune_by_percentile( ['conv3'], q=100-34.0) model.prune_by_percentile( ['conv4'], q=100-36.0) model.prune_by_percentile( ['conv5'], q=100-53.0) model.prune_by_percentile( ['conv6'], q=100-24.0) model.prune_by_percentile( ['conv7'], q=100-42.0) model.prune_by_percentile( ['conv8'], q=100-32.0) model.prune_by_percentile( ['conv9'], q=100-27.0) model.prune_by_percentile( ['conv10'], q=100-34.0) model.prune_by_percentile( ['conv11'], q=100-35.0) model.prune_by_percentile( ['conv12'], q=100-29.0) model.prune_by_percentile( ['conv13'], q=100-36.0) if args.model_mode == 'd' or args.model_mode == 'a': model.prune_by_percentile( ['fc1'], q=100-10.0) model.prune_by_percentile( ['fc2'], q=100-10.0) model.prune_by_percentile( ['fc3'], q=100-10.0) print("------------------------- After pruning --------------------------------") util.print_nonzeros(model, f"{args.save_dir}/{args.log}") accuracy = util.validate(args, test_loader, model, criterion) torch.save(model, f"{args.save_dir}/model_pruned.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"weight\t{args.save_dir}/{args.out_pruned_folder}") util.log(f"{args.save_dir}/{args.log}", f"model\t{args.save_dir}/model_pruned.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"accuracy after pruning\t{accuracy}") util.layer2torch(model, f"{args.save_dir}/{args.out_pruned_folder}") weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_pruned_folder}", weight_list) # Retrain print("------------------------- Prune and Retrain ----------------------------") tok="prune_re" util.initial_train(model, args, train_loader, test_loader, tok, use_cuda=True) print("------------------------- After Retraining -----------------------------") util.print_nonzeros(model, f"{args.save_dir}/{args.log}") accuracy = util.validate(args, test_loader, model, criterion) torch.save(model, f"{args.save_dir}/model_prune_retrain_{args.reepochs}.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"weight\t{args.save_dir}/{args.out_pruned_re_folder}") util.log(f"{args.save_dir}/{args.log}", f"model\t{args.save_dir}/mmodel_prune_retrain_{args.reepochs}.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"accuracy after prune retrain\t{accuracy}") util.layer2torch(model, f"{args.save_dir}/{args.out_pruned_re_folder}") weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_pruned_re_folder}", weight_list) return model
def initial_process(model): print(model) util.print_model_parameters(model) print( "------------------------- Initial training -------------------------------" ) tok = "initial" criterion = nn.CrossEntropyLoss().cuda() util.initial_train(model, args, train_loader, test_loader, tok, use_cuda=True) accuracy = util.validate(args, test_loader, model, criterion) torch.save(model, f"{args.save_dir}/model_initial_end.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"weight:{args.save_dir}/{args.out_oldweight_folder}") util.log(f"{args.save_dir}/{args.log}", f"model:{args.save_dir}/model_initial_end.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"initial_accuracy {accuracy}") util.layer2torch(model, f"{args.save_dir}/{args.out_oldweight_folder}") weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_oldweight_folder}", weight_list) return model
def pruning_process(model): print( "------------------------- Before pruning --------------------------------" ) util.print_nonzeros(model, f"{args.save_dir}/{args.log}") accuracy = util.validate(val_loader, model, args) print( "------------------------- pruning CNN--------------------------------------" ) model.prune_by_percentile(['conv1'], q=100 - 66.0) model.prune_by_percentile(['conv2'], q=100 - 12.0) print( "------------------------------- After prune CNN ----------------------------" ) util.print_nonzeros(model, f"{args.save_dir}/{args.log}") prec1 = util.validate(val_loader, model, args) torch.save(model, f"{args.save_dir}/model_pruned.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"weight\t{args.save_dir}/{args.out_pruned_folder}") util.log(f"{args.save_dir}/{args.log}", f"model\t{args.save_dir}/model_pruned.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"prune acc\t{prec1}") util.layer2torch(f"{args.save_dir}/{args.out_pruned_folder}", model) weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_pruned_folder}", weight_list) print( "------------------------- start retrain after prune CNN----------------------------" ) util.initial_train(model, args, train_loader, val_loader, 'prune_re') print( "------------------------- After Retraining -----------------------------" ) util.print_nonzeros(model, f"{args.save_dir}/{args.log}") accuracy = util.validate(val_loader, model, args) torch.save(model, f"{args.save_dir}/model_prune_retrain_{args.reepochs}.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"weight\t{args.save_dir}/{args.out_pruned_re_folder}") util.log( f"{args.save_dir}/{args.log}", f"model\t{args.save_dir}/model_prune_retrain_{args.reepochs}.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"prune and retrain acc\t{accuracy}") util.layer2torch(f"{args.save_dir}/{args.out_pruned_re_folder}", model) weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_pruned_re_folder}", weight_list) return model
def pruning_process(model): print("------------------------- Before pruning --------------------------------") util.print_nonzeros(model, f"{args.save_dir}/{args.log}") accuracy = util.validate(val_loader, model, args) print("------------------------- pruning CNN--------------------------------------") model.prune_by_percentile( ['conv1'], q=100-58.0) model.prune_by_percentile( ['conv2'], q=100-22.0) model.prune_by_percentile( ['conv3'], q=100-34.0) model.prune_by_percentile( ['conv4'], q=100-36.0) model.prune_by_percentile( ['conv5'], q=100-53.0) model.prune_by_percentile( ['conv6'], q=100-24.0) model.prune_by_percentile( ['conv7'], q=100-42.0) model.prune_by_percentile( ['conv8'], q=100-32.0) model.prune_by_percentile( ['conv9'], q=100-27.0) model.prune_by_percentile( ['conv10'], q=100-34.0) model.prune_by_percentile( ['conv11'], q=100-35.0) model.prune_by_percentile( ['conv12'], q=100-29.0) model.prune_by_percentile( ['conv13'], q=100-36.0) print("------------------------------- After prune CNN ----------------------------") util.print_nonzeros(model, f"{args.save_dir}/{args.log}") prec1 = util.validate(val_loader, model, args) util.save_checkpoint({ 'state_dict': model.state_dict(), 'best_prec1': prec1, }, True, filename=os.path.join(args.save_dir, 'checkpoint_{}_alpha_{}.tar'.format('pruned',args.alpha))) util.log(f"{args.save_dir}/{args.log}", f"weight\t{args.save_dir}/{args.out_pruned_folder}") util.log(f"{args.save_dir}/{args.log}", f"model\t{args.save_dir}/model_pruned.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"prune acc\t{prec1}") util.layer2torch(f"{args.save_dir}/{args.out_pruned_folder}" , model) weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_pruned_folder}", weight_list) print("------------------------- start retrain after prune CNN----------------------------") util.initial_train(model, args, train_loader, val_loader, 'prune_re') print("------------------------- After Retraining -----------------------------") util.print_nonzeros(model, f"{args.save_dir}/{args.log}") accuracy = util.validate(val_loader, model, args) util.log(f"{args.save_dir}/{args.log}", f"weight\t{args.save_dir}/{args.out_pruned_re_folder}") util.log(f"{args.save_dir}/{args.log}", f"model\t{args.save_dir}/model_prune_retrain_{args.reepochs}.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"prune and retrain acc\t{accuracy}") util.layer2torch(f"{args.save_dir}/{args.out_pruned_re_folder}" , model) weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_pruned_re_folder}", weight_list) return model
def initial_process(model): print(model) util.print_model_parameters(model) print("------------------------- Initial training -------------------------------") util.initial_train(model, args, train_loader, val_loader, 'initial') accuracy = util.validate(val_loader, model, args) util.log(f"{args.save_dir}/{args.log}", f"weight\t{args.save_dir}/{args.out_oldweight_folder}") util.log(f"{args.save_dir}/{args.log}", f"model\t{args.save_dir}/model_initial_end.ptmodel") util.log(f"{args.save_dir}/{args.log}", f"initial_accuracy\t{accuracy}") util.layer2torch(f"{args.save_dir}/{args.out_oldweight_folder}",model) weight_list = util.parameters2list(model.children()) util.save_parameters(f"{args.save_dir}/{args.out_oldweight_folder}", weight_list) return model