69 #if __cplusplus > 199711L 85 Types::EMVA methodType,
89 :
TMVA::
MethodBase( jobName, methodType, methodTitle, theData, theOption)
130 DeclareOptionRef(
fRandomSeed = 1,
"RandomSeed",
"Random seed for initial synapse weights (0 means unique seed for each run; default value '1')");
133 "MSE (Mean Square Estimator) for Gaussian Likelihood or CE(Cross-Entropy) for Bernoulli Likelihood" );
140 Int_t nTypes = names->size();
141 for (
Int_t i = 0; i < nTypes; i++)
148 nTypes = names->size();
174 std::vector<Int_t>* layout =
new std::vector<Int_t>();
176 while(layerSpec.
Length()>0) {
178 if (layerSpec.
First(
',')<0) {
183 sToAdd = layerSpec(0,layerSpec.
First(
','));
184 layerSpec = layerSpec(layerSpec.First(
',')+1,layerSpec.Length());
188 nNodes += atoi(sToAdd);
189 layout->push_back(nNodes);
194 layout->push_back(
DataInfo().GetNClasses() );
196 layout->push_back(1);
199 for( std::vector<Int_t>::iterator it = layout->begin(); it != layout->end(); it++ ){
251 for (
Int_t i = 0; i < numLayers; i++) {
281 for (
Int_t i = 0; i < numNeurons; i++) {
343 Int_t numLayers = layout->size();
345 for (
Int_t i = 0; i < numLayers; i++) {
347 BuildLayer(layout->at(i), curLayer, prevLayer, i, numLayers, fromFile);
348 prevLayer = curLayer;
353 for (
Int_t i = 0; i < numLayers; i++) {
356 if (i!=0 && i!=numLayers-1)
fRegulators.push_back(0.);
357 for (
Int_t j = 0; j < numNeurons; j++) {
361 for (
Int_t k = 0; k < numSynapses; k++) {
379 for (
Int_t j = 0; j < numNeurons; j++) {
380 if (fromFile && (layerIndex != numLayers-1) && (j==numNeurons-1)){
385 curLayer->
Add(neuron);
392 if (layerIndex == 0) {
398 if (layerIndex == numLayers-1) {
407 curLayer->
Add(neuron);
413 if (layerIndex != numLayers-1) {
418 curLayer->
Add(neuron);
432 for (
Int_t i = 0; i < numNeurons; i++) {
452 for (
Int_t i = 0; i < numSynapses; i++) {
467 for (
Int_t i = 0; i < numSynapses; i++) {
502 for (
Int_t i = 0; i < numLayers; i++) {
506 for (
Int_t j = 0; j < numNeurons; j++) {
529 Log() <<
kINFO <<
"***Type anything to continue (q to quit): ";
530 std::getline(std::cin, dummy);
531 if (dummy ==
"q" || dummy ==
"Q") {
543 if (!
Debug())
return;
547 Log() <<
kINFO <<
"-------------------------------------------------------------------" <<
Endl;
552 for (
Int_t i = 0; i < numLayers; i++) {
557 Log() <<
kINFO <<
"Layer #" << i <<
" (" << numNeurons <<
" neurons):" <<
Endl;
570 for (
Int_t j = 0; j < numNeurons; j++) {
584 <<
"\t\tValue:\t" << neuron->
GetValue()
587 Log() <<
kINFO <<
"\t\tActivationEquation:\t";
647 for (
UInt_t itgt = 0; itgt < ntgts; itgt++) {
652 for (
UInt_t itgt = 0; itgt < ntgts; itgt++) {
690 std::vector<Float_t> temp;
693 for (
UInt_t icls = 0; icls < nClasses; icls++) {
697 for(
UInt_t iClass=0; iClass<nClasses; iClass++){
699 for(
UInt_t j=0;j<nClasses;j++){
701 norm+=
exp(temp[j]-temp[iClass]);
703 (*fMulticlassReturnVal).push_back(1.0/(1.0+norm));
722 for (
Int_t i = 0; i < numLayers; i++) {
728 for (
Int_t j = 0; j < numNeurons; j++) {
733 if(numSynapses==0)
continue;
734 std::stringstream s(
"");
736 for (
Int_t k = 0; k < numSynapses; k++) {
738 s << std::scientific << synapse->
GetWeight() <<
" ";
762 for(
Int_t row = 0; row < nRows; ++row ){
767 std::stringstream s(
"");
769 for(
Int_t col = 0; col < nCols; ++col ){
770 s << std::scientific << (*(elements+index)) <<
" ";
787 std::vector<Int_t>* layout =
new std::vector<Int_t>();
789 void* xmlLayout =
NULL;
792 xmlLayout = wghtnode;
796 layout->resize( nLayers );
804 layout->at(index) = nNeurons;
833 std::stringstream s(content);
834 for (
UInt_t iSyn = 0; iSyn<nSyn; iSyn++) {
851 void* xmlInvHessian =
NULL;
871 if (nElements > std::numeric_limits<int>::max()-100){
872 Log() <<
kFATAL <<
"you tried to read a hessian matrix with " << nElements <<
" elements, --> too large, guess s.th. went wrong reading from the weight file" <<
Endl;
875 elements =
new Double_t[nElements+10];
888 std::stringstream s(content);
889 for (
Int_t iCol = 0; iCol<nCols; iCol++) {
890 s >> (*(elements+index));
914 std::vector<Double_t>* weights =
new std::vector<Double_t>();
916 while (istr>> dummy >> weight) weights->push_back(weight);
947 meanS, meanB, rmsS, rmsB, xmin, xmax );
951 if (avgVal<meanrms) avgVal = meanrms;
954 for (
Int_t j = 0; j < numSynapses; j++) {
959 importance *= avgVal * avgVal;
970 std::vector<TH1*>* hv )
const 975 for (
Int_t i = 0; i < numLayers-1; i++) {
983 hist =
new TH2F(name +
"", name +
"",
984 numNeurons1, 0, numNeurons1, numNeurons2, 0, numNeurons2);
986 for (
Int_t j = 0; j < numNeurons1; j++) {
991 for (
Int_t k = 0; k < numSynapses; k++) {
994 hist->SetBinContent(j+1, k+1, synapse->
GetWeight());
999 if (hv) hv->push_back( hist );
1021 #if __cplusplus > 199711L 1022 static std::atomic<int> epochMonitoringDirectoryNumber{0};
1024 static int epochMonitoringDirectoryNumber = 0;
1026 int epochVal = epochMonitoringDirectoryNumber++;
1057 fout <<
" double ActivationFnc(double x) const;" << std::endl;
1058 fout <<
" double OutputActivationFnc(double x) const;" << std::endl;
1060 fout <<
" int fLayers;" << std::endl;
1061 fout <<
" int fLayerSize["<<numLayers<<
"];" << std::endl;
1062 int numNodesFrom = -1;
1063 for (
Int_t lIdx = 0; lIdx < numLayers; lIdx++) {
1065 if (numNodesFrom<0) { numNodesFrom=numNodesTo;
continue; }
1066 fout <<
" double fWeightMatrix" << lIdx-1 <<
"to" << lIdx <<
"[" << numNodesTo <<
"][" << numNodesFrom <<
"];";
1067 fout <<
" // weight matrix from layer " << lIdx-1 <<
" to " << lIdx << std::endl;
1068 numNodesFrom = numNodesTo;
1071 fout <<
" double * fWeights["<<numLayers<<
"];" << std::endl;
1072 fout <<
"};" << std::endl;
1076 fout <<
"inline void " << className <<
"::Initialize()" << std::endl;
1077 fout <<
"{" << std::endl;
1078 fout <<
" // build network structure" << std::endl;
1079 fout <<
" fLayers = " << numLayers <<
";" << std::endl;
1080 for (
Int_t lIdx = 0; lIdx < numLayers; lIdx++) {
1083 fout <<
" fLayerSize[" << lIdx <<
"] = " << numNodes <<
"; fWeights["<<lIdx<<
"] = new double["<<numNodes<<
"]; " << std::endl;
1086 for (
Int_t i = 0; i < numLayers-1; i++) {
1087 fout <<
" // weight matrix from layer " << i <<
" to " << i+1 << std::endl;
1090 for (
Int_t j = 0; j < numNeurons; j++) {
1093 for (
Int_t k = 0; k < numSynapses; k++) {
1095 fout <<
" fWeightMatrix" << i <<
"to" << i+1 <<
"[" << k <<
"][" << j <<
"] = " << synapse->
GetWeight() <<
";" << std::endl;
1100 fout <<
"}" << std::endl;
1104 fout <<
"inline double " << className <<
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
1105 fout <<
"{" << std::endl;
1106 fout <<
" if (inputValues.size() != (unsigned int)fLayerSize[0]-1) {" << std::endl;
1107 fout <<
" std::cout << \"Input vector needs to be of size \" << fLayerSize[0]-1 << std::endl;" << std::endl;
1108 fout <<
" return 0;" << std::endl;
1109 fout <<
" }" << std::endl;
1111 fout <<
" for (int l=0; l<fLayers; l++)" << std::endl;
1112 fout <<
" for (int i=0; i<fLayerSize[l]; i++) fWeights[l][i]=0;" << std::endl;
1114 fout <<
" for (int l=0; l<fLayers-1; l++)" << std::endl;
1115 fout <<
" fWeights[l][fLayerSize[l]-1]=1;" << std::endl;
1117 fout <<
" for (int i=0; i<fLayerSize[0]-1; i++)" << std::endl;
1118 fout <<
" fWeights[0][i]=inputValues[i];" << std::endl;
1120 for (
Int_t i = 0; i < numLayers-1; i++) {
1121 fout <<
" // layer " << i <<
" to " << i+1 << std::endl;
1122 if (i+1 == numLayers-1) {
1123 fout <<
" for (int o=0; o<fLayerSize[" << i+1 <<
"]; o++) {" << std::endl;
1126 fout <<
" for (int o=0; o<fLayerSize[" << i+1 <<
"]-1; o++) {" << std::endl;
1128 fout <<
" for (int i=0; i<fLayerSize[" << i <<
"]; i++) {" << std::endl;
1129 fout <<
" double inputVal = fWeightMatrix" << i <<
"to" << i+1 <<
"[o][i] * fWeights[" << i <<
"][i];" << std::endl;
1132 fout <<
" fWeights[" << i+1 <<
"][o] += inputVal;" << std::endl;
1135 fout <<
" fWeights[" << i+1 <<
"][o] += inputVal*inputVal;" << std::endl;
1138 fout <<
" fWeights[" << i+1 <<
"][o] += fabs(inputVal);" << std::endl;
1140 fout <<
" }" << std::endl;
1141 if (i+1 != numLayers-1)
1142 fout <<
" fWeights[" << i+1 <<
"][o] = ActivationFnc(fWeights[" << i+1 <<
"][o]);" << std::endl;
1143 else fout <<
" fWeights[" << i+1 <<
"][o] = OutputActivationFnc(fWeights[" << i+1 <<
"][o]);" << std::endl;
1144 fout <<
" }" << std::endl;
1147 fout <<
" return fWeights[" << numLayers-1 <<
"][0];" << std::endl;
1148 fout <<
"}" << std::endl;
1151 TString fncName = className+
"::ActivationFnc";
1153 fncName = className+
"::OutputActivationFnc";
1156 fout <<
" " << std::endl;
1157 fout <<
"// Clean up" << std::endl;
1158 fout <<
"inline void " << className <<
"::Clear() " << std::endl;
1159 fout <<
"{" << std::endl;
1160 fout <<
" // clean up the arrays" << std::endl;
1161 fout <<
" for (int lIdx = 0; lIdx < "<<numLayers<<
"; lIdx++) {" << std::endl;
1162 fout <<
" delete[] fWeights[lIdx];" << std::endl;
1163 fout <<
" }" << std::endl;
1164 fout <<
"}" << std::endl;
void WaitForKeyboard()
wait for keyboard input, for debugging
virtual void WriteMonitoringHistosToFile() const
write histograms to file
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
virtual Double_t GetMvaValue(Double_t *err=0, Double_t *errUpper=0)
get the mva value generated by the NN
void BuildLayer(Int_t numNeurons, TObjArray *curLayer, TObjArray *prevLayer, Int_t layerIndex, Int_t numLayers, Bool_t from_file=false)
build a single layer with neurons and synapses connecting this layer to the previous layer ...
Random number generator class based on M.
MsgLogger & Endl(MsgLogger &ml)
void ForceNetworkCalculations()
calculate input values to each neuron
virtual TString GetExpression()=0
void CreateWeightMonitoringHists(const TString &bulkname, std::vector< TH1 *> *hv=0) const
virtual TMatrixTBase< Element > & SetMatrixArray(const Element *data, Option_t *option="")
Copy array data to matrix .
void ForceValue(Double_t value)
force the value, typically for input and bias neurons
void DeleteNetwork()
delete/clear network
virtual Double_t Rndm()
Machine independent random number generator.
MethodANNBase(const TString &jobName, Types::EMVA methodType, const TString &methodTitle, DataSetInfo &theData, const TString &theOption)
standard constructor Note: Right now it is an option to choose the neuron input function, but only the input function "sum" leads to weight convergence – otherwise the weights go to nan and lead to an ABORT.
TActivation * fActivation
void AddPreLinks(TNeuron *neuron, TObjArray *prevLayer)
add synapses connecting a neuron to its preceding layer
const Ranking * CreateRanking()
compute ranking of input variables by summing function of weights
void SetPostNeuron(TNeuron *post)
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
virtual void ReadWeightsFromStream(std::istream &istr)
destroy/clear the network then read it back in from the weights file
virtual void MakeClassSpecific(std::ostream &, const TString &) const
write specific classifier response
TNeuronInput * fInputCalculator
XMLNodePointer_t GetNext(XMLNodePointer_t xmlnode, Bool_t realnode=kTRUE)
return next to xmlnode node if realnode==kTRUE, any special nodes in between will be skipped ...
TransformationHandler & GetTransformationHandler(Bool_t takeReroutedIfAvailable=true)
virtual TDirectory * mkdir(const char *name, const char *title="")
Create a sub-directory and return a pointer to the created directory.
UInt_t GetNClasses() const
UInt_t GetNTargets() const
Double_t GetActivationValue() const
void AddWeightsXMLTo(void *parent) const
create XML description of ANN classifier
virtual void DeclareOptions()
define the options (their key words) that can be set in the option string here the options valid for ...
TObject * At(Int_t idx) const
void SetActivationEqn(TActivation *activation)
set activation equation
virtual TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1)
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
static const Bool_t fgDEBUG
const char * GetNodeContent(XMLNodePointer_t xmlnode)
get contents (if any) of xml node
Int_t GetNoElements() const
void ForceWeights(std::vector< Double_t > *weights)
force the synapse weights
Bool_t Debug() const
who the hell makes such strange Debug flags that even use "global pointers"..
const TString & GetInputVar(Int_t i) const
std::vector< TH1 * > fEpochMonHistB
TSynapse * PostLinkAt(Int_t index) const
UInt_t GetTrainingTMVAVersionCode() const
void PrintMessage(TString message, Bool_t force=kFALSE) const
print messages, turn off printing by setting verbose and debug flag appropriately ...
const Event * GetEvent() const
Double_t GetXmin(Int_t ivar) const
DataSetInfo & DataInfo() const
Bool_t DoRegression() const
virtual void ProcessOptions()
do nothing specific at this moment
Ssiz_t First(char c) const
Find first occurrence of a character c.
Int_t NumPreLinks() const
virtual void BuildNetwork(std::vector< Int_t > *layout, std::vector< Double_t > *weights=NULL, Bool_t fromFile=kFALSE)
build network given a layout (number of neurons in each layer) and optional weights array ...
TActivation * CreateActivation(EActivationType type) const
void ReadWeightsFromXML(void *wghtnode)
read MLP from xml weight file
Double_t GetXmax(Int_t ivar) const
Bool_t DoMulticlass() const
Int_t NumPostLinks() const
virtual void PrintNetwork() const
print network representation, for debugging
Float_t GetTarget(UInt_t itgt) const
virtual void MakeFunction(std::ostream &fout, const TString &fncName)=0
Bool_t AddRawLine(XMLNodePointer_t parent, const char *line)
Add just line into xml file Line should has correct xml syntax that later it can be decoded by xml pa...
const char * GetName() const
tomato 2-D histogram with a float per channel (see TH1 documentation)}
void Statistics(Types::ETreeType treeType, const TString &theVarName, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &)
calculates rms,mean, xmin, xmax of the event variable this can be either done for the variables as th...
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
Double_t GetDelta() const
Int_t GetEntriesFast() const
void PrintActivationEqn()
print activation equation, for debugging
char * Form(const char *fmt,...)
virtual void GetMatrix2Array(Element *data, Option_t *option="") const
Copy matrix data to array .
std::vector< TH1 * > fEpochMonHistW
void PrintPostLinks() const
void SetTarget(UInt_t itgt, Float_t value)
set the target value (dimension itgt) to value
std::vector< Double_t > fRegulators
TNeuron * GetInputNeuron(Int_t index)
std::vector< Int_t > fRegulatorIdx
void InitWeights()
initialize the synapse weights randomly
Double_t GetValue() const
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
TString & Remove(Ssiz_t pos)
#define TMVA_VERSION(a, b, c)
std::vector< Int_t > * ParseLayoutString(TString layerSpec)
parse layout specification string and return a vector, each entry containing the number of neurons to...
XMLAttrPointer_t NewAttr(XMLNodePointer_t xmlnode, XMLNsPointer_t, const char *name, const char *value)
creates new attribute for xmlnode, namespaces are not supported for attributes
virtual const std::vector< Float_t > & GetMulticlassValues()
get the multiclass classification values generated by the NN
TNeuron * GetOutputNeuron(Int_t index=0)
Describe directory structure in memory.
std::vector< Float_t > * fMulticlassReturnVal
void PrintPreLinks() const
Bool_t IsNormalised() const
void ForceNetworkInputs(const Event *ev, Int_t ignoreIndex=-1)
force the input values of the input neurons force the value for each input neuron ...
static RooMathCoreReg dummy
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void CalculateValue()
calculate neuron input
void AddPreDefVal(const T &)
std::vector< TNeuron * > fOutputNeurons
virtual ~MethodANNBase()
destructor
void SetPreNeuron(TNeuron *pre)
void SetWeight(Double_t weight)
set synapse weight
void CalculateActivationValue()
calculate neuron activation/output
std::vector< TString > * GetAllActivationNames() const
Abstract ClassifierFactory template that handles arbitrary types.
void AddPostLink(TSynapse *post)
add synapse as a post-link to this neuron
virtual Bool_t cd(const char *path=0)
Change current directory to "this" directory.
XMLNodePointer_t GetChild(XMLNodePointer_t xmlnode, Bool_t realnode=kTRUE)
returns first child of xml node
TDirectory * BaseDir() const
returns the ROOT directory where info/histograms etc of the corresponding MVA method instance are sto...
virtual void AddRank(const Rank &rank)
Add a new rank take ownership of it.
XMLNodePointer_t NewChild(XMLNodePointer_t parent, XMLNsPointer_t ns, const char *name, const char *content=0)
create new child element for parent node
virtual const std::vector< Float_t > & GetRegressionValues()
get the regression value generated by the NN
void PrintNeuron(TNeuron *neuron) const
print a neuron, for debugging
Int_t GetEntries() const
Return the number of objects in array (i.e.
std::vector< TH1 * > fEpochMonHistS
std::vector< Float_t > * fRegressionReturnVal
void AddPreLink(TSynapse *pre)
add synapse as a pre-link to this neuron
void DeletePreLinks()
delete all pre-links
TH1F * fEstimatorHistTrain
void DeleteNetworkLayer(TObjArray *&layer)
delete a network layer
THist< 2, float, THistStatContent, THistStatUncertainty > TH2F
void BuildLayers(std::vector< Int_t > *layout, Bool_t from_file=false)
build the network layers
double norm(double *x, double *p)
void SetInputCalculator(TNeuronInput *calculator)
set input calculator
TH1F * fEstimatorHistTest
void NoErrorCalc(Double_t *const err, Double_t *const errUpper)
void PrintLayer(TObjArray *layer) const
print a single layer, for debugging
void InitANNBase()
initialize ANNBase object
const char * Data() const