/* trainboltzmannperceptron.cpp - train perceptron in boltzmann machine way (random zero one output) Copyright (C) 2010 Rui Rodrigues This software is released under the terms of the GNU General Public License (http://www.gnu.org/copyleft/gpl.html). */ #include #include #include #include #include using namespace std; #include "gradgsl.h" #include "netdimsandfilenames.h" #include #include #include void checkfstream(ofstream& file_io,const char* filename); //in checkfstream.cpp void checkfstream(ifstream& file_io,const char* filename); //in checkfstream.cpp void read_datafile(ifstream&in,netdimsandfilenames& A); //in netdimsandfilenames.cpp void logistic (gsl_matrix * m,int nrows,int ncols); //in parallelgradgsl.cpp void writegslmatriz(const char* filename,gsl_matrix*m); void readgslmatriz(const char* filename,gsl_matrix*&m); //in iogslvectormatrix.cpp void useblacklist(gsl_matrix * &inputdata,const char*blacklistfile); //in blacklist.cpp const string start="start"; const string cont="cont"; const string blacklist_use="useblacklist"; // ---------------------------------------------------------------------------------------- //-----------------------CONFIGURE----------------------------------------------------- const size_t batchsize=500; const size_t numepochs=100; const double epsilonweights=0.1; const double epsilonbias=0.1; const double momentum=0.5; const double weightscost=0.002; //----------------------------------------------------------------------------------- int main(int argc, char ** argv){ try{ if(argc<5){ cout<<" must be called with argument start or cont, after signal1 then signal2 and at last folder name. Optionaly thereis an extra argument: useblacklist !"<size2!=ninputs){ cout<<"inputdata is not compatible with ninputs!"<size2!=noutputs){ cout<<"outputdata is not compatible with noutputs!"<size1; size_t numbatches=npatches/batchsize; //---------------------------------------------------------- //gsl random number generator gsl_rng *r = gsl_rng_alloc(gsl_rng_taus2); int long seed=time (NULL) * getpid(); gsl_rng_set(r,seed); //file for perceptronweights string f="../"; f.append(cc); f.append("/perceptron_"); // string signal1=argv[2]; //string signal2=argv[3]; f.append(signal1); f.append("_"); f.append(signal2); f.append(".txt"); //load weights gsl_matrix * weights=gsl_matrix_alloc (ninputs+1,noutputs); if(a==1) //random weights for(int i=0; igsl_rng_uniform (r)) gsl_matrix_set(product,i,j,1.0); else gsl_matrix_set(product,i,j,0.0); gsl_matrix_scale (product, -1.0); gsl_matrix_add (product,&batchoutputdata.matrix ); //deltabias and new bias gsl_blas_dgemv (CblasTrans, epsilonbias/batchsize,product, ones, momentum, deltabias); gsl_vector_add (&bias.vector,deltabias); //deltaweights and new weights gsl_blas_dgemm(CblasTrans, CblasNoTrans, epsilonweights/batchsize, &batchinputdata.matrix, product, momentum, deltaweights); //compensate for weight cost gsl_matrix_scale (&pureweights.matrix, 1.0-weightscost); gsl_matrix_add (&pureweights.matrix,deltaweights); gsl_vector_view diff=gsl_vector_view_array (product->data, batchsize*noutputs); error=gsl_blas_dnrm2 (&diff.vector); printf("epoch %4i batch %4i square error rate per patch %e \r", epoch, batch,error*error/batchsize); fflush(stdout); } } gsl_vector_free(deltabias); gsl_matrix_free(deltaweights); gsl_vector_free(ones); gsl_matrix_free(product); gsl_matrix_free(permuted_inputdata); gsl_matrix_free(permuted_outputdata); gsl_rng_free (r); //save weights writegslmatriz(f.c_str(),weights); //gsl_matrix_free(batchoutputdata); //-------------------------computer error rate after training------------ //insert bias on matrix for(int i=0;i<(int) npatches;++i) gsl_matrix_set_row (&imagedata.matrix,i,&bias.vector); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, inputdata, &pureweights.matrix, 1.0, &imagedata.matrix); logistic (&imagedata.matrix,npatches,noutputs); gsl_matrix_sub (&imagedata.matrix,outputdata); error=gsl_blas_dnrm2 (vectorimagedata); cout<<"square error rate by patch after training is "<<(error*error)/npatches<