int main(int argc, const char **argv) { parse(argc, argv); // load training set load(trainfile.c_str(), xtrain, ytrain); cout << "Number of features " << dim << "." << endl; int imin = 0; int imax = xtrain.size() - 1; if (maxtrain > 0 && imax >= maxtrain) imax = imin + maxtrain -1; // prepare svm SvmSgd svm(dim, lambda); Timer timer; // load testing set if (! testfile.empty()) load(testfile.c_str(), xtest, ytest); int tmin = 0; int tmax = xtest.size() - 1; for(int i=0; i<epochs; i++) { cout << "--------- Epoch " << i+1 << "." << endl; timer.start(); svm.train(imin, imax, xtrain, ytrain); timer.stop(); cout << "Total training time " << setprecision(6) << timer.elapsed() << " secs." << endl; svm.test(imin, imax, xtrain, ytrain, "train: "); if (tmax >= tmin) svm.test(tmin, tmax, xtest, ytest, "test: "); } }
void load(const char *fname, xvec_t &xp, yvec_t &yp) { cout << "Loading " << fname << "." << endl; igzstream f; f.open(fname); if (! f.good()) { cerr << "ERROR: cannot open " << fname << "." << endl; exit(10); } int pcount = 0; int ncount = 0; bool binary; string suffix = fname; if (suffix.size() >= 7) suffix = suffix.substr(suffix.size() - 7); if (suffix == ".dat.gz") binary = false; else if (suffix == ".bin.gz") binary = true; else { cerr << "ERROR: filename should end with .bin.gz or .dat.gz" << endl; exit(10); } while (f.good()) { SVector x; double y; if (binary) { y = (f.get()) ? +1 : -1; x.load(f); } else { f >> y >> x; } if (f.good()) { assert(y == +1 || y == -1); xp.push_back(x); yp.push_back(y); if (y > 0) pcount += 1; else ncount += 1; if (x.size() > dim) dim = x.size(); } if (trainsize > 0 && xp.size() > (unsigned int)trainsize) break; } cout << "Read " << pcount << "+" << ncount << "=" << pcount + ncount << " examples." << endl; }
int main(int argc, const char **argv) { parse(argc, argv); config(argv[0]); if (trainfile) load_datafile(trainfile, xtrain, ytrain, dims, normalize, maxtrain); if (testfile) load_datafile(testfile, xtest, ytest, dims, normalize); cout << "# Number of features " << dims << "." << endl; // prepare svm int imin = 0; int imax = xtrain.size() - 1; int tmin = 0; int tmax = xtest.size() - 1; // heuristic determination of averaging start point int avgfrom = fabs(avgstart) * (imax - imin + 1); avgfrom = (avgstart < 0 && dims < avgfrom) ? dims : avgfrom; // create SvmAisgd svm(dims, lambda, avgfrom); Timer timer; // determine eta0 using sample int smin = 0; int smax = imin + min(1000, imax); timer.start(); svm.determineEta0(smin, smax, xtrain, ytrain); timer.stop(); // train for(int i=0; i<epochs; i++) { cout << "--------- Epoch " << i+1 << "." << endl; timer.start(); svm.train(imin, imax, xtrain, ytrain); timer.stop(); cout << "Total training time " << setprecision(6) << timer.elapsed() << " secs." << endl; svm.test(imin, imax, xtrain, ytrain, "train: "); if (tmax >= tmin) svm.test(tmin, tmax, xtest, ytest, "test: "); } svm.renorm(); // Linear classifier is in svm.a and svm.aBias return 0; }
int main(int argc, const char **argv) { parse(argc, argv); config(argv[0]); if (trainfile) load_datafile(trainfile, xtrain, ytrain, dims, normalize, maxtrain); if (testfile) load_datafile(testfile, xtest, ytest, dims, normalize); cout << "# Number of features " << dims << "." << endl; // prepare svm int imin = 0; int imax = xtrain.size() - 1; int tmin = 0; int tmax = xtest.size() - 1; SvmSag svm(dims, lambda); Timer timer; // determine eta0 using sample int smin = 0; int smax = imin + min(1000, imax); timer.start(); if (eta > 0) svm.setEta(eta); else svm.determineEta(smin, smax, xtrain, ytrain); timer.stop(); // train for(int i=0; i<epochs; i++) { cout << "--------- Epoch " << i+1 << "." << endl; timer.start(); if (i == 0) svm.trainInit(imin, imax, xtrain, ytrain); else svm.trainSag(imin, imax, xtrain, ytrain); timer.stop(); cout << "Total training time " << setprecision(6) << timer.elapsed() << " secs." << endl; svm.test(imin, imax, xtrain, ytrain, "train: "); if (tmax >= tmin) svm.test(tmin, tmax, xtest, ytest, "test: "); } return 0; }
int main(int argc, const char **argv) { parse(argc, argv); config(argv[0]); if (trainfile) load_datafile(trainfile, xtrain, ytrain, dims, normalize, maxtrain); if (testfile) load_datafile(testfile, xtest, ytest, dims, normalize); cout << "# Number of features " << dims << "." << endl; // prepare svm int imin = 0; int imax = xtrain.size() - 1; int tmin = 0; int tmax = xtest.size() - 1; SvmSgd svm(dims, lambda); Timer timer; // determine eta0 using sample int smin = 0; int smax = imin + min(1000, imax); // train Timer totalTimer, overheadtimer, exetimer; totalTimer.start(); //winnie, initial wDivisor and wBias timeval t1, t4, t5, t6, t7, t8; overheadtimer.start(); if(sample_file){ int sample_size = 500; int bin_num = 20; int num_compare = 49; int dimension = dims - 1; //The first feature is the classification, does not count in sampling. gettimeofday(&t1, NULL); Sampling<double> selector(imax, 0 , dimension, sample_size, bin_num, num_compare); selector.do_sampling(sample_file); gettimeofday(&t4, NULL); selector.calc_ecdf(); gettimeofday(&t5, NULL); // std::cout << "test init kmeans " << std::endl; //step3a, do database search if(num_compare <= 0){ cerr << "Number of comparison is less than or equal to 0" << endl; return -1; } else{ //TODO: make the comparison choose the second best result, when we use data base that contains dataset itself //winnie, prerun several iterations, and log some information int prerun_iters = 3; FVector old_w(dimension); svm.determineEta0(smin, smax, xtrain, ytrain); for(int i = 0; i < prerun_iters; i ++ ){ svm.get_w(old_w); svm.train(imin, imax, xtrain, ytrain); //svm.test(imin, imax, xtrain, ytrain, "train: "); } //get the idx of dimensions map <double, int> delta_w; svm.get_delta_w(old_w, delta_w); //int reducedDimNum[8] = {1, 2, 3, 4, 8, 16, 32, 50}; int reducedDimNum[8] = {1, 3, 8, 16, 32, 50, 64, 128}; int selected_id[9]; multimap <double, int> error_dim; //error value and dimension for(int iout = 0; iout < 8; iout++){ vector<int> reducedDimIdx(reducedDimNum[iout]); map<double, int>::reverse_iterator rmit = delta_w.rbegin(); double sum_value = 0; for(int i = 0; i < reducedDimNum[iout]; i ++){ reducedDimIdx[i] = rmit->second; sum_value += rmit->first; //cout << "reduceDim: " << reducedDimIdx[i] << " value " << rmit->first << endl; rmit++; } cout << "sum_value: " << sum_value << " with dim num: " << reducedDimNum[iout] << endl; //cout << "distancetype: " << distancetype << endl; selected_id[iout] = selector.search_database('b', database_file, distancetype, reducedDimIdx); gettimeofday(&t6, NULL); if(selected_id[iout] < 0) return -1; else{ std::cout << "selected id: " << selected_id[iout] << std::endl; //Do data customization, use norm.cpp program, stringstream ss;//create a stringstream ss << setfill('0') << setw(2) << selected_id[iout]; string filename = string(database_dir) + "/" + ss.str() + ".txt"; // double value1, value2; // selector.load_memo(filename.c_str(), &value1, &value2); cout << "Init with file: " << filename << endl; svm.init_w(filename.c_str(), dims); gettimeofday(&t7, NULL); //run one iter use current w double pre_loss_1; //, pre_loss_2; //double pre_loss_delta_1; //, pre_loss_delta_2; //svm.train(imin, imax, xtrain, ytrain); svm.test(tmin, tmax, xtest, ytest, "test: "); pre_loss_1 = svm.get_cost(); /* svm.train(imin, imax, xtrain, ytrain); svm.test(tmin, tmax, xtest, ytest, "test: "); pre_loss_2 = svm.get_cost(); pre_loss_delta_1 = pre_loss_1 - pre_loss_2; */ double pre_loss_delta_ratio = pre_loss_1; //method A //double pre_loss_delta_ratio = pre_loss_delta_1; //method B //double pre_loss_delta_ratio = -svm.t; //method C cout << "-svm.t: " << -svm.t << endl; //svm.train(imin, imax, xtrain, ytrain); //svm.test(tmin, tmax, xtest, ytest, "test: "); //pre_loss_3 = svm.get_cost(); //pre_loss_delta_2 = pre_loss_2 - pre_loss_3; /* double pre_loss_delta_ratio; if(pre_loss_delta_1 < 0 || pre_loss_delta_2 < 0){ pre_loss_delta_ratio = 1000; } else pre_loss_delta_ratio = predict_iter(pre_loss_delta_1, pre_loss_delta_2, pre_loss_2); cout << "pre_loss_1: " << pre_loss_1 << endl; cout << "pre_loss_2: " << pre_loss_2 << endl; cout << "pre_loss_3: " << pre_loss_3 << endl; cout << "pre_loss_delta_1: " << pre_loss_delta_1 << endl; cout << "pre_loss_delta_2: " << pre_loss_delta_2 << endl; */ cout << "insert pre_loss_ratio " << pre_loss_delta_ratio << " at dim " << reducedDimNum[iout] << endl; error_dim.insert(pair<double, int>(pre_loss_delta_ratio, iout)); //error_dim.insert(pair<double, int>(fabs(pre_loss_new - pre_loss_old), iout)); } } stringstream ss;//create a stringstream ss << setfill('0') << setw(2) << selected_id[error_dim.begin()->second]; string filename = string(database_dir) + "/" + ss.str() + ".txt"; cout << "Init with: " << filename << endl; svm.init_w(filename.c_str(), dims); cout << "chosen dim num: " << reducedDimNum[error_dim.begin()->second] << " id: " << selected_id[error_dim.begin()->second] << endl; cout << "error of each dim_reduction: " << endl; cout << error_dim.size() << "in total\n" ; for(map<double, int>::iterator mit = error_dim.begin(); mit != error_dim.end(); mit++){ cout << mit->second << " " << mit->first << endl; } //winnie, end of prerun } } else{ if(!initpara_file){ cerr << "initpara_file does not exist\n"; } else svm.init_w(initpara_file, dims); } overheadtimer.stop(); //winnie, end of initial wDivisor and wBias exetimer.start(); timer.start(); //double temp_t = 1; //Original version //svm.determineEta0(imin, imax, xtrain, ytrain); //svm.determineEta0(smin, smax, xtrain, ytrain); //svm.t = 0; //Version 3 -------------------------------------------------------- svm.my_determineEta0_v3(imin, imax, xtrain, ytrain); //svm.my_determineEta0_v3(smin, smax, xtrain, ytrain); //svm.t = 0; //svm.t = 500000; //Version 2 -------------------------------------------------------- //svm.my_determineEta0_v2(smin, smax, xtrain, ytrain, svm.t, 4); //svm.my_determineEta0_v2(imin, imax, xtrain, ytrain, svm.t, 4); //svm.my_determineEta0(imin, imax, xtrain, ytrain, svm.t); timer.stop(); //svm.eta0 = svm.eta0 / 10; //svm.t = 0; cout << "New eta0: " << svm.eta0 << " t: " << svm.t << endl; cout << "eta: " << setprecision(12) << svm.eta0 / (1 + lambda * svm.eta0 * svm.t) << endl; //winnie, modify code end condition from number of epochs to misclassification rate double loss_new = 1, loss_old = 1; int i = 0; // for(int i=0; i<epochs; i++) if(revalue == 0){ svm.test(imin, imax, xtrain, ytrain); loss_new = svm.get_cost(); while(loss_old - loss_new > 1e-5 || loss_new - loss_old > 1e-5) { cout << "--------- Epoch " << ++i << endl; //timer.start(); svm.train(imin, imax, xtrain, ytrain); //timer.stop(); //cout << "Total training time " << setprecision(6) // << timer.elapsed() << " secs." << endl; svm.test(imin, imax, xtrain, ytrain, "train: "); if (tmax >= tmin) svm.test(tmin, tmax, xtest, ytest, "test: "); loss_old = loss_new; loss_new = svm.get_cost(); } } else{ cout<< "[Main: svm.wDivisor: ]" << setprecision(12) <<svm.wDivisor << " svm.t: " << svm.t << "svm.eta0: " << svm.eta0 << endl; while(loss_new > revalue) { cout << "--------- Epoch " << ++i << endl; //timer.start(); svm.train(imin, imax, xtrain, ytrain); //timer.stop(); //cout << "Total training time " << setprecision(6) // << timer.elapsed() << " secs." << endl; svm.test(imin, imax, xtrain, ytrain, "train: "); loss_old = loss_new; loss_new = svm.get_cost(); if (tmax >= tmin) svm.test(tmin, tmax, xtest, ytest, "test: "); if(i >= 200){ cout << "Exit because reach 2 epochs\n"; break; } } } cout << "Loss_new: " << loss_new << " Loss_old:" << loss_old << endl; exetimer.stop(); totalTimer.stop(); cout << "Total time: " << setprecision(6) << totalTimer.elapsed() << " secs." << endl; cout << "Total exe time: " << setprecision(6) << exetimer.elapsed() << " secs." << endl; cout << "Total overhead time: " << setprecision(6) << overheadtimer.elapsed() << " secs." << endl; if(sample_file){ double elapsedTime; elapsedTime =(t4.tv_sec - t1.tv_sec) * 1000.0 + (t4.tv_usec - t1.tv_usec) / 1000.0; // sec and us to ms std::cout <<"Overhead s1: "<< elapsedTime << " ms.\n"; elapsedTime =(t5.tv_sec - t4.tv_sec) * 1000.0 + (t5.tv_usec - t4.tv_usec) / 1000.0; // sec and us to ms std::cout <<"Overhead s2: "<< elapsedTime << " ms.\n"; elapsedTime =(t6.tv_sec - t5.tv_sec) * 1000.0 + (t6.tv_usec - t5.tv_usec) / 1000.0; // sec and us to ms std::cout <<"Overhead s3: "<< elapsedTime << " ms.\n"; elapsedTime =(t7.tv_sec - t6.tv_sec) * 1000.0 + (t7.tv_usec - t6.tv_usec) / 1000.0; // sec and us to ms std::cout <<"Overhead s4: "<< elapsedTime << " ms.\n"; elapsedTime =(t8.tv_sec - t7.tv_sec) * 1000.0 + (t8.tv_usec - t7.tv_usec) / 1000.0; // sec and us to ms std::cout <<"Overhead s5: "<< elapsedTime << " ms.\n"; } //winnie, output parameter wDivisor and wBias: cout << "wDivisor: " << svm.get_wDivisor() << endl; cout << "wBias: " << svm.get_wBias() << endl; svm.output_w(outputfile); return 0; }