// Training SVM with feature vector X and label Y. // Each row of X is a feature vector, with corresponding label in Y. // Return a CV_32F weight Mat Mat Objectness::trainSVM(CMat &X1f, const vecI &Y, int sT, double C, double bias, double eps) { // Set SVM parameters parameter param; { param.solver_type = sT; // L2R_L2LOSS_SVC_DUAL; param.C = C; param.eps = eps; // see setting below param.p = 0.1; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; set_print_string_function(print_null); CV_Assert(X1f.rows == Y.size() && X1f.type() == CV_32F); } // Initialize a problem feature_node *x_space = NULL; problem prob;{ prob.l = X1f.rows; prob.bias = bias; prob.y = Malloc(double, prob.l); prob.x = Malloc(feature_node*, prob.l); const int DIM_FEA = X1f.cols; prob.n = DIM_FEA + (bias >= 0 ? 1 : 0); x_space = Malloc(feature_node, (prob.n + 1) * prob.l); int j = 0; for (int i = 0; i < prob.l; i++){ prob.y[i] = Y[i]; prob.x[i] = &x_space[j]; const float* xData = X1f.ptr<float>(i); for (int k = 0; k < DIM_FEA; k++){ x_space[j].index = k + 1; x_space[j++].value = xData[k]; } if (bias >= 0){ x_space[j].index = prob.n; x_space[j++].value = bias; } x_space[j++].index = -1; } CV_Assert(j == (prob.n + 1) * prob.l); } // Training SVM for current problem const char* error_msg = check_parameter(&prob, ¶m); if(error_msg){ fprintf(stderr,"ERROR: %s\n",error_msg); exit(1); } model *svmModel = train(&prob, ¶m); Mat wMat(1, prob.n, CV_64F, svmModel->w); wMat.convertTo(wMat, CV_32F); free_and_destroy_model(&svmModel); destroy_param(¶m); free(prob.y); free(prob.x); free(x_space); return wMat; }
void set_default_params(){ void (*print_func)(const char*) = NULL; // default printing to stdout // default values param.solver_type = L2R_LR; //L2R_LR_DUAL;//L1R_LR;// param.C = 1; param.eps = INF; // see setting below param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; flag_cross_validation = 1; bias = -1; set_print_string_function(print_func); if(param.eps == INF){ if(param.solver_type == L2R_LR || param.solver_type == L2R_L2LOSS_SVC) param.eps = 0.01; else if(param.solver_type == L2R_L2LOSS_SVC_DUAL || param.solver_type == L2R_L1LOSS_SVC_DUAL || param.solver_type == MCSVM_CS || param.solver_type == L2R_LR_DUAL) param.eps = 0.1; else if(param.solver_type == L1R_L2LOSS_SVC || param.solver_type == L1R_LR) param.eps = 0.01; } }
void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name) { int i; void (*print_func)(const char*) = NULL; // default printing to stdout // default values param.solver_type = L2R_L2LOSS_SVC_DUAL; param.C = 1; param.eps = INF; // see setting below param.p = 0.1; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; param.init_sol = NULL; flag_cross_validation = 0; flag_warm_start = 0; flag_C_specified = 0; flag_solver_specified = 0; flag_find_C = 0; bias = -1; // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; if(++i>=argc) exit_with_help(); switch(argv[i-1][1]) { case 's': param.solver_type = atoi(argv[i]); flag_solver_specified = 1; break; case 'c': param.C = atof(argv[i]); flag_C_specified = 1; break; case 'p': param.p = atof(argv[i]); break; case 'e': param.eps = atof(argv[i]); break; case 'B': bias = atof(argv[i]); break; case 'w': ++param.nr_weight; param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); param.weight[param.nr_weight-1] = atof(argv[i]); break; case 'v': flag_cross_validation = 1; nr_fold = atoi(argv[i]); if(nr_fold < 2) { fprintf(stderr,"n-fold cross validation: n must >= 2\n"); exit_with_help(); } break; case 'q': print_func = &print_null; i--; break; case 'i': flag_warm_start = 1; if((initial_model=load_model(argv[i]))==0) { fprintf(stderr,"can't open initial model file %s\n",argv[i]); exit_with_help(); } break; case 'C': flag_find_C = 1; i--; break; default: fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]); exit_with_help(); break; } } if(flag_warm_start) { if(param.solver_type != L2R_LR && param.solver_type != L2R_L2LOSS_SVC) { fprintf(stderr,"-i is supported only for -s 0 and 2\n"); exit(1); } if(param.solver_type != initial_model->param.solver_type) fprintf(stderr,"Warning: the solver type of initial model dose not match your -s option\n"); } set_print_string_function(print_func); // determine filenames if(i>=argc) exit_with_help(); strcpy(input_file_name, argv[i]); if(i<argc-1) strcpy(model_file_name,argv[i+1]); else { char *p = strrchr(argv[i],'/'); if(p==NULL) p = argv[i]; else ++p; sprintf(model_file_name,"%s.model",p); } // default solver for parameter selection is L2R_L2LOSS_SVC if(flag_find_C) { if(!flag_cross_validation) nr_fold = 5; if(!flag_solver_specified) { fprintf(stderr, "Solver not specified. Using -s 2\n"); param.solver_type = L2R_L2LOSS_SVC; } else if(param.solver_type != L2R_LR && param.solver_type != L2R_L2LOSS_SVC) { fprintf(stderr, "Warm-start parameter search only available for -s 0 and -s 2\n"); exit_with_help(); } } if(param.eps == INF) { switch(param.solver_type) { case L2R_LR: case L2R_L2LOSS_SVC: param.eps = 0.01; break; case L2R_L2LOSS_SVR: param.eps = 0.001; break; case L2R_L2LOSS_SVC_DUAL: case L2R_L1LOSS_SVC_DUAL: case MCSVM_CS: case L2R_LR_DUAL: param.eps = 0.1; break; case L1R_L2LOSS_SVC: case L1R_LR: param.eps = 0.01; break; case L2R_L1LOSS_SVR_DUAL: case L2R_L2LOSS_SVR_DUAL: param.eps = 0.1; break; } } }
void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name) { int i; void (*print_func)(const char*) = NULL; // default printing to stdout // default values param.solver_type = L2R_L2LOSS_SVC_DUAL; param.C = 1; param.eps = INF; // see setting below param.p = 0.1; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; param.concurrency = 1; flag_cross_validation = 0; bias = -1; // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; if(++i>=argc) exit_with_help(); switch(argv[i-1][1]) { case 's': param.solver_type = atoi(argv[i]); break; case 'c': param.C = atof(argv[i]); break; case 'p': param.p = atof(argv[i]); break; case 'e': param.eps = atof(argv[i]); break; case 'B': bias = atof(argv[i]); break; case 'w': ++param.nr_weight; param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); param.weight[param.nr_weight-1] = atof(argv[i]); break; case 'v': flag_cross_validation = 1; nr_fold = atoi(argv[i]); if(nr_fold < 2) { fprintf(stderr,"n-fold cross validation: n must >= 2\n"); exit_with_help(); } break; case 'q': print_func = &print_null; i--; break; case 'n': param.concurrency = atoi(argv[i]); break; default: fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]); exit_with_help(); break; } } set_print_string_function(print_func); // determine filenames if(i>=argc) exit_with_help(); strcpy(input_file_name, argv[i]); if(i<argc-1) strcpy(model_file_name,argv[i+1]); else { char *p = strrchr(argv[i],'/'); if(p==NULL) p = argv[i]; else ++p; sprintf(model_file_name,"%s.model",p); } if(param.eps == INF) { switch(param.solver_type) { case L2R_LR: case L2R_L2LOSS_SVC: param.eps = 0.01; break; case L2R_L2LOSS_SVR: param.eps = 0.001; break; case L2R_L2LOSS_SVC_DUAL: case L2R_L1LOSS_SVC_DUAL: case MCSVM_CS: case L2R_LR_DUAL: param.eps = 0.1; break; case L1R_L2LOSS_SVC: case L1R_LR: param.eps = 0.01; break; case L2R_L1LOSS_SVR_DUAL: case L2R_L2LOSS_SVR_DUAL: param.eps = 0.1; break; } } }
/* provide convenience wrapper */ void set_verbosity(int verbosity_flag){ if (verbosity_flag) set_print_string_function(&print_string_stdout); else set_print_string_function(&print_null); }
cv::Mat_<double> cRegression::__train_regressor(const cv::Mat_<double>& label_vec, const cv::Mat_<int>& instance_mat) { void(*print_func)(const char*) = &print_null; const char *error_msg; struct parameter param; struct problem problem; struct feature_node *x_space = NULL; srand(1); // std::cout << "initialize liblinear parameter." << std::endl; param.solver_type = L2R_L2LOSS_SVR_DUAL; param.C = 1.0 / (double)label_vec.rows; param.eps = 0.1; param.p = 0; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; // std::cout << "initialize liblinear parameter finished." << std::endl; set_print_string_function(print_func); std::vector<int>* prob_x = NULL; prob_x = new std::vector<int>[label_vec.rows]; // number of samples = label_vec.rows size_t nzcount = 0; // std::cout << "copy feature." << std::endl; for (int i = 0; i < instance_mat.rows; ++i) { for (int j = 0; j < instance_mat.cols; ++j) { int elem = instance_mat(i, j); if (elem != 0) { prob_x[i].push_back(j); ++nzcount; } } } // std::cout << "copy feature finished." << std::endl; //sort the vector for (int i = 0; i < label_vec.rows; i++){ std::sort(prob_x[i].begin(), prob_x[i].end()); } problem.l = label_vec.rows; problem.n = instance_mat.cols; problem.bias = -1; int elements = (int)(nzcount + problem.l); problem.y = Malloc(double, problem.l); problem.x = Malloc(struct feature_node *, problem.l); x_space = Malloc(struct feature_node, elements); int j = 0; for (int i = 0; i < problem.l; i++){ problem.y[i] = label_vec(i, 0); problem.x[i] = &x_space[j]; for (int k = 0; k < prob_x[i].size(); k++){ x_space[j].index = prob_x[i][k] + 1; x_space[j].value = 1; j++; } x_space[j++].index = -1; } delete[] prob_x; error_msg = check_parameter(&problem, ¶m); if (error_msg){ fprintf(stderr, "ERROR: %s\n", error_msg); } // std::cout << "train model." << std::endl; struct model *model = NULL; model = train(&problem, ¶m); // std::cout << "train model finished." << std::endl; cv::Mat_<double> weight = cv::Mat::zeros(model->nr_feature, 1, CV_64FC1); for (int i = 0; i < model->nr_feature; i++){ weight(i, 0) = model->w[i]; // std::cout << weight(i, 0) << " "; // std::endl; } free_and_destroy_model(&model); destroy_param(¶m); free((void*)(problem.y)); free((void*)(problem.x)); free((void*)(x_space)); return weight; }
// nrhs should be 3 int parse_command_line(int nrhs, const mxArray *prhs[], char *model_file_name) { int i, argc = 1; char cmd[CMD_LEN]; char *argv[CMD_LEN/2]; void (*print_func)(const char *) = print_string_matlab; // default printing to matlab display // default values param.solver_type = L2R_L2LOSS_SVC_DUAL; param.C = 1; param.eps = INF; // see setting below param.p = 0.1; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; cross_validation_flag = 0; col_format_flag = 0; bias = -1; if(nrhs <= 1) return 1; if(nrhs == 4) { mxGetString(prhs[3], cmd, mxGetN(prhs[3])+1); if(strcmp(cmd, "col") == 0) col_format_flag = 1; } // put options in argv[] if(nrhs > 2) { mxGetString(prhs[2], cmd, mxGetN(prhs[2]) + 1); if((argv[argc] = strtok(cmd, " ")) != NULL) while((argv[++argc] = strtok(NULL, " ")) != NULL) ; } // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; ++i; if(i>=argc && argv[i-1][1] != 'q') // since option -q has no parameter return 1; switch(argv[i-1][1]) { case 's': param.solver_type = atoi(argv[i]); break; case 'c': param.C = atof(argv[i]); break; case 'p': param.p = atof(argv[i]); break; case 'e': param.eps = atof(argv[i]); break; case 'B': bias = atof(argv[i]); break; case 'v': cross_validation_flag = 1; nr_fold = atoi(argv[i]); if(nr_fold < 2) { mexPrintf("n-fold cross validation: n must >= 2\n"); return 1; } break; case 'w': ++param.nr_weight; param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); param.weight[param.nr_weight-1] = atof(argv[i]); break; case 'q': print_func = &print_null; i--; break; default: mexPrintf("unknown option\n"); return 1; } } set_print_string_function(print_func); if(param.eps == INF) { switch(param.solver_type) { case L2R_LR: case L2R_L2LOSS_SVC: param.eps = 0.01; break; case L2R_L2LOSS_SVR: param.eps = 0.001; break; case L2R_L2LOSS_SVC_DUAL: case L2R_L1LOSS_SVC_DUAL: case MCSVM_CS: case L2R_LR_DUAL: param.eps = 0.1; break; case L1R_L2LOSS_SVC: case L1R_LR: param.eps = 0.01; break; case L2R_L1LOSS_SVR_DUAL: case L2R_L2LOSS_SVR_DUAL: param.eps = 0.1; break; } } return 0; }
void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name) #endif { int i; void (*print_func)(const char*) = NULL; // default printing to stdout // default values param.solver_type = AVLTREE ;//L2R_L2LOSS_SVC param.C = 1; param.eps = INF; // see setting below param.p = 0; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; param.col_size = 50;//default param.ite = 200;//default param.eta = 1e-6;//default param.batch_size = 10; // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; if(++i>=argc) exit_with_help(); switch(argv[i-1][1]) { case 's': param.solver_type = atoi(argv[i]); break; case 'C': param.C = atof(argv[i]); break; case 'c': param.col_size = (int)atof(argv[i]); break; case 'l': param.col_size =(int) atof(argv[i]); break; case 'b': param.batch_size =(int) atof(argv[i]); break; case 'i': param.ite = (int)atof(argv[i]); break; case 'p': param.p = atof(argv[i]); break; case 'e': param.eta = atof(argv[i]); break; case 'q': print_func = &print_null; i--; break; default: fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]); exit_with_help(); break; } } set_print_string_function(print_func); // determine filenames if(i>=argc) exit_with_help(); strcpy(input_file_name, argv[i]); #ifdef FIGURE56 if(i<argc-1) strcpy(test_file_name,argv[i+1]); else { exit_with_help(); } #else if(i<argc-1) strcpy(model_file_name,argv[i+1]); else { //strrchr() 函数查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回 false。 //与之相对应的是strchr()函数,它查找字符串中首次出现指定字符的位置。 char *p = strrchr(argv[i],'/'); if(p==NULL)//there are no parent directories in the path of train data, that means train data are in the current directory p = argv[i]; else//the train data contain parent directoryis, ++p: the pointer move from char '/' to the first char of the input train data ++p; sprintf(model_file_name,"%s.model",p);//int sprintf ( char * str, const char * format, ... );Write formatted data to string } #endif if(param.eps == INF) { switch(param.solver_type) { case L2R_L2LOSS_SVC: param.eps = 0.01; break; case L2R_L2LOSS_SVR: case WX_RBTREE: case Y_RBTREE: case AVLTREE: case AATREE: case DIRECT_COUNT: case SELECTION_TREE: case PRSVMP: param.eps = 0.001; break; case L2R_L1LOSS_SVR_DUAL: param.eps = 0.1; break; } } }
// nrhs should be 3 int parse_command_line(int nrhs, const mxArray *prhs[], char *model_file_name) { int i, argc = 1; char cmd[CMD_LEN]; char *argv[CMD_LEN/2]; void (*print_func)(const char *) = print_string_matlab; // default printing to matlab display // default values param.solver_type = L2R_L2LOSS_SVC_DUAL; param.C = 1; param.eps = INF; // see setting below param.p = 0.1; param.nr_thread = 1; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; param.init_sol = NULL; flag_cross_validation = 0; col_format_flag = 0; flag_C_specified = 0; flag_solver_specified = 0; flag_find_C = 0; flag_omp = 0; bias = -1; if(nrhs <= 1) return 1; if(nrhs == 4) { mxGetString(prhs[3], cmd, mxGetN(prhs[3])+1); if(strcmp(cmd, "col") == 0) col_format_flag = 1; } // put options in argv[] if(nrhs > 2) { mxGetString(prhs[2], cmd, mxGetN(prhs[2]) + 1); if((argv[argc] = strtok(cmd, " ")) != NULL) while((argv[++argc] = strtok(NULL, " ")) != NULL) ; } // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; ++i; if(i>=argc && argv[i-1][1] != 'q' && argv[i-1][1] != 'C') // since options -q and -C have no parameter return 1; switch(argv[i-1][1]) { case 's': param.solver_type = atoi(argv[i]); flag_solver_specified = 1; break; case 'c': param.C = atof(argv[i]); flag_C_specified = 1; break; case 'p': param.p = atof(argv[i]); break; case 'e': param.eps = atof(argv[i]); break; case 'B': bias = atof(argv[i]); break; case 'n': flag_omp = 1; param.nr_thread = atoi(argv[i]); break; case 'v': flag_cross_validation = 1; nr_fold = atoi(argv[i]); if(nr_fold < 2) { mexPrintf("n-fold cross validation: n must >= 2\n"); return 1; } break; case 'w': ++param.nr_weight; param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); param.weight[param.nr_weight-1] = atof(argv[i]); break; case 'q': print_func = &print_null; i--; break; case 'C': flag_find_C = 1; i--; break; default: mexPrintf("unknown option\n"); return 1; } } set_print_string_function(print_func); // default solver for parameter selection is L2R_L2LOSS_SVC if(flag_find_C) { if(!flag_cross_validation) nr_fold = 5; if(!flag_solver_specified) { mexPrintf("Solver not specified. Using -s 2\n"); param.solver_type = L2R_L2LOSS_SVC; } else if(param.solver_type != L2R_LR && param.solver_type != L2R_L2LOSS_SVC) { mexPrintf("Warm-start parameter search only available for -s 0 and -s 2\n"); return 1; } } //default solver for parallel execution is L2R_L2LOSS_SVC if(flag_omp) { if(!flag_solver_specified) { mexPrintf("Solver not specified. Using -s 2\n"); param.solver_type = L2R_L2LOSS_SVC; } else if(param.solver_type != L2R_LR && param.solver_type != L2R_L2LOSS_SVC && param.solver_type != L2R_L2LOSS_SVR && param.solver_type != L2R_L1LOSS_SVC_DUAL && param.solver_type != L2R_L2LOSS_SVC_DUAL) { mexPrintf("Parallel LIBLINEAR is only available for -s 0, 1, 2, 3, 11 now.\n"); return 1; } #ifndef CV_OMP mexPrintf("Total threads used: %d\n", param.nr_thread); #endif } #ifdef CV_OMP if(flag_cross_validation) { int cvthreads = nr_fold; int maxthreads = omp_get_num_procs(); if(flag_omp) { omp_set_nested(1); maxthreads = omp_get_num_procs()/param.nr_thread; } if(cvthreads > maxthreads) cvthreads = maxthreads; omp_set_num_threads(cvthreads); mexPrintf("Total threads used: %d\n", cvthreads*param.nr_thread); } #endif if(param.eps == INF) { switch(param.solver_type) { case L2R_LR: case L2R_L2LOSS_SVC: param.eps = 0.01; break; case L2R_L2LOSS_SVR: param.eps = 0.001; break; case L2R_L2LOSS_SVC_DUAL: case L2R_L1LOSS_SVC_DUAL: case MCSVM_CS: case L2R_LR_DUAL: param.eps = 0.1; break; case L1R_L2LOSS_SVC: case L1R_LR: param.eps = 0.01; break; case L2R_L1LOSS_SVR_DUAL: case L2R_L2LOSS_SVR_DUAL: param.eps = 0.1; break; } } return 0; }
void parse_command_line(int argc, char **argv) { int i; void (*print_func)(const char*) = NULL; // default printing to stdout char input_file_name[1024]; char test_file_name[1024]; // default values param.solver_type = L2R_L2LOSS_SVC_DUAL; param.C = 1; param.eps = INF; // see setting below param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; bias = -1; // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; if(++i>=argc) exit_with_help(); switch(argv[i-1][1]) { case 'b': flag_predict_probability = atoi(argv[i]); break; case 's': param.solver_type = atoi(argv[i]); break; case 'c': param.C = atof(argv[i]); break; case 'e': param.eps = atof(argv[i]); break; case 'B': bias = atof(argv[i]); break; case 'w': ++param.nr_weight; param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); param.weight[param.nr_weight-1] = atof(argv[i]); break; case 'q': print_func = &print_null; i--; break; case 'r': nb_runs = atoi(argv[i]); break; case 'l': trnsz = atoi(argv[i]); break; default: fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]); exit_with_help(); break; } } set_print_string_function(print_func); // determine filenames if(i+2>=argc) exit_with_help(); printf("reading train file %s\n",argv[i]); strcpy(input_file_name, argv[i]); prob=read_problem(input_file_name); printf("reading test file %s\n",argv[i+1]); strcpy(test_file_name, argv[i+1]); tprob=read_problem(test_file_name); output = fopen(argv[i+2],"a"); if(output == NULL) { fprintf(stderr,"can't open output file %s\n",argv[i+2]); exit(1); } if(param.eps == INF) { if(param.solver_type == L2R_LR || param.solver_type == L2R_L2LOSS_SVC) param.eps = 0.01; else if(param.solver_type == L2R_L2LOSS_SVC_DUAL || param.solver_type == L2R_L1LOSS_SVC_DUAL || param.solver_type == MCSVM_CS) param.eps = 0.1; else if(param.solver_type == L1R_L2LOSS_SVC || param.solver_type == L1R_LR) param.eps = 0.01; } }
void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name) { int i; void (*print_func)(const char*) = NULL; // default printing to stdout // default values param.solver_type = L2R_L2LOSS_SVC_DUAL; param.C = 1; param.eps = INF; // see setting below param.p = 0.1; param.nr_thread = 1; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; param.init_sol = NULL; flag_cross_validation = 0; flag_C_specified = 0; flag_solver_specified = 0; flag_find_C = 0; flag_omp = 0; bias = -1; // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; if(++i>=argc) exit_with_help(); switch(argv[i-1][1]) { case 's': param.solver_type = atoi(argv[i]); flag_solver_specified = 1; break; case 'c': param.C = atof(argv[i]); flag_C_specified = 1; break; case 'p': param.p = atof(argv[i]); break; case 'e': param.eps = atof(argv[i]); break; case 'B': bias = atof(argv[i]); break; case 'n': flag_omp = 1; param.nr_thread = atoi(argv[i]); break; case 'w': ++param.nr_weight; param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); param.weight[param.nr_weight-1] = atof(argv[i]); break; case 'v': flag_cross_validation = 1; nr_fold = atoi(argv[i]); if(nr_fold < 2) { fprintf(stderr,"n-fold cross validation: n must >= 2\n"); exit_with_help(); } break; case 'q': print_func = &print_null; i--; break; case 'C': flag_find_C = 1; i--; break; default: fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]); exit_with_help(); break; } } set_print_string_function(print_func); // determine filenames if(i>=argc) exit_with_help(); strcpy(input_file_name, argv[i]); if(i<argc-1) strcpy(model_file_name,argv[i+1]); else { char *p = strrchr(argv[i],'/'); if(p==NULL) p = argv[i]; else ++p; sprintf(model_file_name,"%s.model",p); } // default solver for parameter selection is L2R_L2LOSS_SVC if(flag_find_C) { if(!flag_cross_validation) nr_fold = 5; if(!flag_solver_specified) { fprintf(stderr, "Solver not specified. Using -s 2\n"); param.solver_type = L2R_L2LOSS_SVC; } else if(param.solver_type != L2R_LR && param.solver_type != L2R_L2LOSS_SVC) { fprintf(stderr, "Warm-start parameter search only available for -s 0 and -s 2\n"); exit_with_help(); } } //default solver for parallel execution is L2R_L2LOSS_SVC if(flag_omp) { if(!flag_solver_specified) { fprintf(stderr, "Solver not specified. Using -s 2\n"); param.solver_type = L2R_L2LOSS_SVC; } else if(param.solver_type != L2R_LR && param.solver_type != L2R_L2LOSS_SVC && param.solver_type != L2R_L2LOSS_SVR) { fprintf(stderr, "Parallel LIBLINEAR is only available for -s 0, 2, 11 now\n"); exit_with_help(); } #ifndef CV_OMP printf("Total threads used: %d\n", param.nr_thread); #endif } #ifdef CV_OMP if(flag_cross_validation) { int cvthreads = nr_fold; int maxthreads = omp_get_num_procs(); if(flag_omp) { omp_set_nested(1); maxthreads = omp_get_num_procs()/param.nr_thread; } if(cvthreads > maxthreads) cvthreads = maxthreads; omp_set_num_threads(cvthreads); printf("Total threads used: %d\n", cvthreads*param.nr_thread); } #endif if(param.eps == INF) { switch(param.solver_type) { case L2R_LR: case L2R_L2LOSS_SVC: param.eps = 0.01; break; case L2R_L2LOSS_SVR: param.eps = 0.001; break; case L2R_L2LOSS_SVC_DUAL: case L2R_L1LOSS_SVC_DUAL: case MCSVM_CS: case L2R_LR_DUAL: param.eps = 0.1; break; case L1R_L2LOSS_SVC: case L1R_LR: param.eps = 0.01; break; case L2R_L1LOSS_SVR_DUAL: case L2R_L2LOSS_SVR_DUAL: param.eps = 0.1; break; } } }
void LVlinear_set_logging_userevent(lvError *lvErr, LVUserEventRef *loggingUserEvent_in) { loggingUsrEv = loggingUserEvent_in; set_print_string_function(LVlinear_print_function); }
void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name) { int i; void (*print_func)(const char*) = NULL; // default printing to stdout // default values param.solver_type = MMCD; param.C = 1; param.eps = INF; // see setting below param.p = 0.1; param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; flag_cross_validation = 0; bias = -1; param.reg_param = 1; // L2 regularizer param.loss_param = 0.5; // tau for HU1, HU2 param.curv_param = 1e-3; // epsilon for minimum curvature value for NC param.loss_type = HU2; // Huberized-hinge loss param.curv_type = OC; // optimal curv param.turn_to_nc = 0; param.save_each_iter = 0; param.init_model_file = NULL; param.chat_level = 0; // minimal talk param.cg_tol = 0.001; param.cd_tol = 0.01; param.cd_reset = 10; param.structured_w = 0; param.transform_matrix = 0; param.tmx_c = 0; param.tmx_r = 0; // parse options for(i=1;i<argc;i++) { if(argv[i][0] != '-') break; if(++i>=argc) exit_with_help(); switch(argv[i-1][1]) { case 's': param.solver_type = atoi(argv[i]); break; case 'c': param.C = atof(argv[i]); break; case 'p': param.p = atof(argv[i]); break; case 'e': param.eps = atof(argv[i]); break; case 'B': bias = atof(argv[i]); break; case 'w': ++param.nr_weight; param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); param.weight[param.nr_weight-1] = atof(argv[i]); break; case 'v': flag_cross_validation = 1; nr_fold = atoi(argv[i]); if(nr_fold < 2) { fprintf(stderr,"n-fold cross validation: n must >= 2\n"); exit_with_help(); } break; case 'q': print_func = &print_null; i--; break; case 'l': param.loss_type = (loss_var) atoi(argv[i]); break; case 'u': if(atoi(argv[i]) < 3) { param.curv_type = (curv_var) atoi(argv[i]); param.turn_to_nc = 0; } else if(atoi(argv[i]) == 3) { param.curv_type = (curv_var) 0; param.turn_to_nc = 1; } else if(atoi(argv[i]) == 4) { param.curv_type = (curv_var) 1; param.turn_to_nc = 1; } break; case 'r': param.reg_param = atof(argv[i]); break; case 'd': param.cd_tol = atof(argv[i]); break; case 'f': param.cd_reset = atoi(argv[i]); break; case 'g': param.cg_tol = atof(argv[i]); break; case 'x': param.test_file = Malloc(char,1024); strcpy(param.test_file, argv[i]); break; case 't': param.loss_param = atof(argv[i]); break; case 'n': param.curv_param = atof(argv[i]); break; case 'i': param.init_model_file = Malloc(char,1024); strcpy(param.init_model_file, argv[i]); break; case 'h': param.chat_level = atoi(argv[i]); break; case 'S': if(strcmp(argv[i],"s")==0 || strcmp(argv[i],"a")==0) { param.structured_w = argv[i][0]; printf("\nUsing symmetric or asymmetric matrix as %c\n",param.structured_w); } else { param.transform_matrix = read_transform_matrix(argv[i],param.tmx_r,param.tmx_c); param.structured_w = 'f'; printf("\nUsing free transform matrix %s\n",argv[i]); } break; case 'X': param.save_each_iter = Malloc(char,1024); strcpy(param.save_each_iter, argv[i]); break; default: fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]); exit_with_help(); break; } } set_print_string_function(print_func); // determine filenames if(i>=argc) exit_with_help(); strcpy(input_file_name, argv[i]); if(i<argc-1) strcpy(model_file_name,argv[i+1]); else { char *p = strrchr(argv[i],'/'); if(p==NULL) p = argv[i]; else ++p; sprintf(model_file_name,"%s.model",p); } if(param.eps == INF) { switch(param.solver_type) { case L2R_LR: case L2R_L2LOSS_SVC: param.eps = 0.01; break; case L2R_L2LOSS_SVR: param.eps = 0.001; break; case L2R_L2LOSS_SVC_DUAL: case L2R_L1LOSS_SVC_DUAL: case MCSVM_CS: case L2R_LR_DUAL: param.eps = 0.1; break; case L1R_L2LOSS_SVC: case L1R_LR: param.eps = 0.01; break; case L2R_L1LOSS_SVR_DUAL: case L2R_L2LOSS_SVR_DUAL: param.eps = 0.1; break; } if(param.solver_type == MMCD ||param.solver_type == MMCD_SM || param.solver_type == MMCD_SG || param.solver_type == MMCD_SIMPLE || param.solver_type == MMGCD || param.solver_type == MMCG ) param.eps = 0.01; } }