/* trabcd1rbmvislinear.cpp - train rbmvislinear in cd-1 way (random zero one output in the hidden layer) 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 #include #include #include #include #include "netdimsandfilenames.h" #include #include #include #ifdef _OPENMP #include #endif 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,size_t nrows,size_t ncols); //down in this file void writegslmatriz(const char* filename,gsl_matrix*m); void readgslmatriz(const char* filename,gsl_matrix*&m); void readgslvector(const char* filename,gsl_vector*m); void writegslvector(const char* filename,gsl_vector*m); //in iogslvectormatrix.cpp void useblacklist(gsl_matrix * &inputdata,const char*blacklistfile); //in blacklist.cpp // ---------------------------------------------------------------------------------------- //-----------------------CONFIGURE----------------------------------------------------- const size_t batchsize=500; const size_t numepochs=100; const double epsilonweights=0.01; const double epsilonbias=0.01; const double momentum=0.2; const double weightscost=0.0002; //----------------------------------------------------------------------------------- class netrbmvislinear{ public: netrbmvislinear(unsigned ninputs,unsigned nhidden, unsigned numcases, unsigned Maxnumthreads,unsigned Blocksize, unsigned Npatches, gsl_vector *Vectorweightsandbias); ~netrbmvislinear(); //data gsl_matrix *permutedtdata, *hiddenlayer, * batchimagedata, *posprobs, *negprobs, *hiddenactivation, *posprods, *negprods, *deltapureweights; gsl_vector *vectorweightsandbias,*deltavisbias, *deltahidbias, *sumbatchtdata, *sumbatchimagedata, *sumposprobs, *sumnegprobs; gsl_matrix_view batchtdata, *blocktdata, *blockposprobs, *blocknegprobs, *blockimagedata, *blockhiddenactivation,pureweights; gsl_vector_view visbias, hidbias; unsigned ninputs, nhidden, numcases, maxnumthreads, *sizesblocks, blocksize, npatches; }; netrbmvislinear::netrbmvislinear(unsigned Ninputs,unsigned Nhidden, unsigned Numcases, unsigned Maxnumthreads, unsigned Blocksize, unsigned Npatches, gsl_vector *Vectorweightsandbias){ ninputs=Ninputs; nhidden=Nhidden; numcases=Numcases; maxnumthreads=Maxnumthreads; blocksize=Blocksize; npatches=Npatches; vectorweightsandbias=Vectorweightsandbias;//just copy the pointer //numcases is batchsize or npatches permutedtdata=gsl_matrix_alloc(npatches,ninputs); posprobs=gsl_matrix_calloc(numcases,nhidden); negprobs=gsl_matrix_calloc(numcases,nhidden); hiddenactivation=gsl_matrix_calloc(numcases,nhidden); batchimagedata=gsl_matrix_calloc(numcases,ninputs); posprods=gsl_matrix_calloc(ninputs,nhidden); negprods=gsl_matrix_calloc(ninputs,nhidden); deltapureweights=gsl_matrix_calloc(ninputs,nhidden); deltavisbias=gsl_vector_alloc(ninputs); deltahidbias=gsl_vector_alloc(nhidden); sizesblocks=new unsigned[maxnumthreads]; for(unsigned i=0;isize2!=ninputs){ cout<<"inputdata is not compatible with ninputs!"<size1; //gsl random number generator gsl_rng *r = gsl_rng_alloc(gsl_rng_taus2); unsigned long seed=time (NULL) * getpid(); gsl_rng_set(r,seed); //load weights (first matrix with pure weights then visible bias finally //hidden bias gsl_vector * vectorweightsandbias=gsl_vector_calloc (ninputs*nhidden+ninputs+nhidden); if(a==1) //random weights for(unsigned i=0;isize;++i) gsl_vector_set(vectorweightsandbias,i,gsl_ran_gaussian(r,0.01)); else if(a==2) //load weights from file readgslvector(A1.netvislinearweights.c_str(),vectorweightsandbias); //computer error rate before training double error=compute_error_rbmvislinear(vectorweightsandbias, data,ninputs,nhidden); cout<<"error rate by patch before training is "<size1; const unsigned blocksize=npatches/maxnumthreads; gsl_matrix*hiddendata=gsl_matrix_calloc(npatches,nhidden); gsl_vector*vectorimagedata=gsl_vector_calloc(npatches*ninputs); gsl_matrix_view imagedata=gsl_matrix_view_vector(vectorimagedata,npatches,ninputs); //block views to previous matrices unsigned *sizesblocks=new unsigned[maxnumthreads]; for(int i=0;i