/* backpropmlp1layer.cpp - train the waits of an mlp with one hidden layer using backprop algorithm 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). */ //--------------------------------------------------------------------------------------------------- // from the 1rst hidden layer of a set of signals to the 2nd hidden layer of target signal //--------------------------------------------------------------------------------------------------- #include #include #include #include #include using namespace std; #include "gradgsl.h" #include #include #include #include "netdimsandfilenames.h" void writegslmatriz(const char* filename,gsl_matrix*m); void readgslmatriz(const char* filename,gsl_matrix*&m); //in iogslvectormatrix.cpp void checkfstream(ifstream& file_io,const char* filename); //in checkfstream.cpp void read_datafile(ifstream&in,netdimsandfilenames& A); //in netdimsandfilenames.cpp //void convertmatrixtolinevectorcway(const matrix&original,matrix&linevector); //down in this file void savegslvectormatrix(FILE* writetofile, gsl_vector* v,vector&sizes); //iogslvectormatrices.cpp void readgslvectormatrix(FILE* readfromfile, gsl_vector* v,vector&sizes); void readgslvectorasmatriz(const char* filename,gsl_vector*v); //iogslvectormatrices.cpp void useblacklist(gsl_matrix * &inputdata,const char*blacklistfile); //in blacklist.cpp // ------------------------------------------------------------------- const string start="start"; const string cont="cont"; const string startperceptron="startperceptron"; const string blacklist_use="useblacklist"; // ---------------------------------------------------------------------------------------- //-----------------------CONFIGURE----------------------------------------------------- const size_t batchsize=500; const size_t numepochs=200; //----------------------------------------------------------------------------------- int main(int argc, char ** argv){ try{ if(argc<5){ cout<<" must be called with argument start, startperceptron or cont and after signal1 then signal2 and folder name. Optionaly there is an extra argument: useblacklist !"<size1!=outputdata->size1){ cout<<"number of patches for input and outputdata is not the same!"<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); //load weights ------------------------------------------------------ //file for mlp1layerweights string f="../"; f.append(cc); f.append("/mlp1layers_"); f.append(signal1); f.append("_"); f.append(signal2); f.append(".txt"); int nrows[]={ninputs+1,nhidden0+1}; int ncols[]={nhidden0,noutputs}; gsl_vector * minimumweights=gsl_vector_alloc (td.tamtotal); cout<<"loading weights"< sizes; FILE * readweights = fopen(A1.backpropautoencodercoefficientsfile.c_str(), "r"); readgslvectormatrix(readweights, aux1,sizes); int coef2ndmatrixstart=(A1.patchsize*A1.nsignals+1)*A1.nhidden0; int numcoef2ndmatrix=(A1.nhidden0+1)*A1.nhidden1; gsl_vector_const_view aux2=gsl_vector_const_subvector(aux1, coef2ndmatrixstart,numcoef2ndmatrix); gsl_vector_view aux3=gsl_vector_subvector(minimumweights, 0,numcoef2ndmatrix); gsl_vector_memcpy (&aux3.vector,&aux2.vector); if(a==1){ //for the matrix from the hidden layer to the output the initial weights are random generated; //matrix randomweights(1,(A1.nhidden1+1)*A2.nhidden1); //randomweights=randn(nnormal,1,(A1.nhidden1+1)*A2.nhidden1); for(int i=0;i<(A1.nhidden1+1)*A2.nhidden1;++i) //gsl_vector_set(minimumweights,numcoef2ndmatrix+1,randomweights(0,i)); gsl_vector_set(minimumweights,numcoef2ndmatrix+1,gsl_ran_gaussian(r,1.0)); } else if(a==3){ //load weights from perceptron //file f perceptronweights string p="../"; p.append(cc); p.append("/perceptron_"); p.append(signal1); p.append("_"); p.append(signal2); p.append(".txt"); gsl_vector_view aux4=gsl_vector_subvector(minimumweights, numcoef2ndmatrix, nrows[1]*ncols[1]); //debug // cout<<"before loading perceptron weights the norm of this parte of weights vector is "<< gsl_blas_dnrm2(&aux4.vector)< sizes; FILE * readweights = fopen(f.c_str(), "r"); readgslvectormatrix(readweights, minimumweights,sizes); } //end loading weights---------------------------------------- //compute error with initialweights { cout<<"computing initial error rate"<gradient, 1e-3); //printf ("%5d %10.5f\n", iter,s->f); } while (status == GSL_CONTINUE && iter < maxiterations); printf("epoch %4i batch %4i error rate %f \r", epoch, batch,(s->f)*(s->f)/batchsize); fflush(stdout); gsl_vector_memcpy (minimumweights,s->x); gsl_multimin_fdfminimizer_free (s); } } gsl_matrix_free(permutedinputdata); gsl_matrix_free(permutedoutputdata); gsl_rng_free (r); //end of optimization------------------------------------------ //write new weights in a file------------------------------------- int matricesdimensions[]={2,dimensions[0]+1,dimensions[1],dimensions[1]+1,dimensions[2]}; vector matdimensions(matricesdimensions,matricesdimensions+5); FILE * writeweights = fopen(f.c_str(), "w"); savegslvectormatrix(writeweights, minimumweights,matdimensions); fclose(writeweights); //-------------------------computer error rate after training------------ { parametersfwdgsl parameters(numhidlayers,dimensions,npatches); gsl_matrix_memcpy(¶meters.reallayerdata[0].matrix,inputdata); double error_rate=just_compute_error_gsl_vislogistic(minimumweights,¶meters,outputdata); cout<<"error rate after training is "<