#include "CbmEcalNN.h" #include "TString.h" #include "TRandom.h" #include "TMath.h" #include "TMatrixD.h" #include #include using namespace std; CbmEcalNN::CbmEcalNN(const char* str) : fN(-1111), fStr(NULL), fNeurons(NULL), fWNeurons(NULL), fWSynapses(NULL), fNNeurons(-1111), fNSynapses(-1111), fMS(-1111), fCurrent(NULL), fDNeurons(NULL), fDeDNeurons(NULL), fDeDSynapses(NULL), fDEDNeurons(NULL), fDEDSynapses(NULL), fOld(NULL), fReset(50), fEta(0.1), fEpsilon(0.0), fDelta(0.0), fEtaDecay(1.0), fLastAlpha(0.0), fTau(3.0) { Int_t i; Int_t n=1; TString st=""; for(i=0;str[i]!=0;i++) { if (str[i]==':') { n++; continue; } if (str[i]<48||str[i]>57) { cerr << "Wrong symbol in " << str << " at " << i+1 << endl; return; } } fStr=new Int_t[n]; n=0; for(i=0;str[i]!=0;i++) { if (str[i]==':') { fStr[n++]=st.Atoi(); st=""; continue; } st+=str[i]; } fStr[n++]=st.Atoi(); fN=n; //Counting neurons and synapses n=0; for(i=0;i> n1 >> n2; //Skip the normalization. We do not use it! f.getline(buff, 100); f.getline(buff, 100); //output normalization header for(i=0;i> n1 >> n2; //Skip the normalization. We do not use it! f.getline(buff, 100); f.getline(buff, 100); //neuron weights header for(i=0;i> fWNeurons[i]; } f.getline(buff, 100); f.getline(buff, 100); //synapse weights header for(i=0;i> fWSynapses[i]; } f.getline(buff, 100); f.close(); delete[] buff; } void CbmEcalNN::DumpWeights(const char* filename) // In ROOT compatible format { ofstream f(filename); Int_t i; f << "#input normalization" << endl; for(i=0;iUniform(-0.5, 0.5); for(i=0;iUniform(-0.5, 0.5); } Double_t CbmEcalNN::Eval(Int_t idx, Double_t* input) { Int_t i; Int_t j; Int_t k; Int_t dn=0; Int_t dn1; Int_t dn2; Int_t ds=0; Int_t ds1; Int_t ds2; Int_t tmp; Double_t t; for(i=0;i0;i--) { dn1=dn; dn-=fStr[i]; ds=ss; ds2=fStr[i+1]; //For all neurons in layer for(j=dn;j0;i--) { dn1=dn; dn-=fStr[i]; dn2=dn-fStr[i-1]; ds=ss=ss-fStr[i]*fStr[i-1]; ds2=fStr[i-1]; //For all neurons in layer for(j=dn;j0) { SteepestDir(dir); bfgsh.UnitMatrix(); } if (LineSearch(dir, buf, n, dta)) { SteepestDir(dir); bfgsh.UnitMatrix(); if (LineSearch(dir, buf, n, dta)) { Error("Train()", "Line search failed :("); ie=epochs; } } cout << "Epoch: "<< ie << " (Root Error: " << TMath::Sqrt(GetError(n, dta)/n) << ")" << endl << flush; // cout << "Epoch: " << ie << endl; } delete [] buf; delete [] dir; //TODO } Bool_t CbmEcalNN::GetBFGSH(TMatrixD& bfgsh, TMatrixD& gamma, TMatrixD& delta) //From ROOT: //Computes the hessian matrix using the BFGS update algorithm. //from gamma (g_{(t+1)}-g_{(t)}) and delta (w_{(t+1)}-w_{(t)}). //Returns true if such a direction could not be found //(gamma and delta are orthogonal). { TMatrixD gd(gamma, TMatrixD::kTransposeMult, delta); if (gd[0][0]==0.0) return kTRUE; TMatrixD aHg(bfgsh, TMatrixD::kMult, gamma); TMatrixD tmp(gamma, TMatrixD::kTransposeMult, bfgsh); TMatrixD gHg(gamma, TMatrixD::kTransposeMult, aHg); Double_t a=1.0/gd[0][0]; Double_t f=1.0+(gHg[0][0]*a); // TMatrixD res(TMatrixD(delta, TMatrixD::kMult, TMatrixD(TMatrixD::kTransposed, delta))); TMatrixD res(delta, TMatrixD::kMult, TMatrixD(TMatrixD::kTransposed, delta)); res*=f; res-=(TMatrixD(delta,TMatrixD::kMult,tmp)+TMatrixD(aHg,TMatrixD::kMult,TMatrixD(TMatrixD::kTransposed, delta))); res*=a; bfgsh+=res; /* Int_t i; Int_t j; for(i=0;iInteger(n); k=idx[j]; idx[j]=idx[i]; idx[i]=k; } } CbmEcalNN::~CbmEcalNN() { delete [] fStr; delete [] fWNeurons; delete [] fNeurons; delete [] fWSynapses; delete [] fCurrent; delete [] fDNeurons; delete [] fDeDNeurons; delete [] fDeDSynapses; delete [] fDEDNeurons; delete [] fDEDSynapses; delete [] fOld; } ClassImp(CbmEcalNN)