73 std::map<TString, TString>::const_iterator it = keyValueMap.find(key);
74 if (it == keyValueMap.end()) {
127 if (value ==
"TRUE" || value ==
"T" || value ==
"1") {
137 std::vector<double> defaultValue)
140 if (parseString ==
"") {
145 std::vector<double> values;
149 TIter nextToken(tokenStrings);
151 for (; tokenString != NULL; tokenString = (
TObjString *)nextToken()) {
152 std::stringstream sstr;
155 sstr >> currentValue;
156 values.push_back(currentValue);
173 " or cross entropy (binary classification).");
189 "Specify as 0.2 or 20% to use a fifth of the data set as validation set. "
190 "Specify as 100 to use exactly 100 events. (Default: 20%)");
203 "ConvergenceSteps=50,"
207 "Regularization=None,"
214 "ConvergenceSteps=50,"
220 "DropConfig=0.0+0.5+0.5,"
222 "Multithreading=True",
223 "TrainingStrategy",
"Defines the training strategies.");
231 Log() << kINFO <<
"Will ignore negative events in training!" <<
Endl;
235 Log() << kWARNING <<
"The STANDARD architecture is not supported anymore. "
236 "Please use Architecture=CPU or Architecture=CPU."
237 "See the TMVA Users' Guide for instructions if you "
238 "encounter problems."
240 Log() << kINFO <<
"We will use instead the CPU architecture" <<
Endl;
244 Log() << kERROR <<
"The OPENCL architecture has not been implemented yet. "
245 "Please use Architecture=CPU or Architecture=CPU for the "
246 "time being. See the TMVA Users' Guide for instructions "
247 "if you encounter problems."
250 Log() << kINFO <<
"We will try using the GPU-CUDA architecture if available" <<
Endl;
259 Log() << kINFO <<
"Will now use the GPU architecture !" <<
Endl;
261 Log() << kERROR <<
"CUDA backend not enabled. Please make sure "
262 "you have CUDA installed and it was successfully "
263 "detected by CMAKE by using -Dtmva-gpu=On "
266 Log() << kINFO <<
"Will now use instead the CPU architecture !" <<
Endl;
272 Log() << kINFO <<
"Will now use the CPU architecture with BLAS and IMT support !" <<
Endl;
274 Log() << kINFO <<
"Multi-core CPU backend not enabled. For better performances, make sure "
275 "you have a BLAS implementation and it was successfully "
276 "detected by CMake as well that the imt CMake flag is set."
278 Log() << kINFO <<
"Will use anyway the CPU architecture but with slower performance" <<
Endl;
298 Log() << kWARNING <<
"For regression only SUMOFSQUARES is a valid "
299 <<
" neural net error function. Setting error function to "
300 <<
" SUMOFSQUARES now." <<
Endl;
339 for (
auto &
block : strategyKeyValues) {
362 if (optimizer ==
"SGD") {
364 }
else if (optimizer ==
"ADAM") {
366 }
else if (optimizer ==
"ADAGRAD") {
368 }
else if (optimizer ==
"RMSPROP") {
370 }
else if (optimizer ==
"ADADELTA") {
446 TIter nextInputDim(inputDimStrings);
452 std::vector<size_t> inputShape;
453 inputShape.reserve(inputLayoutString.
Length()/2 + 2);
454 inputShape.push_back(30);
455 for (; inputDimString !=
nullptr; inputDimString = (
TObjString *)nextInputDim()) {
460 inputShape.push_back(subDim);
465 if (inputShape.size() == 2) {
467 inputShape.insert(inputShape.begin() + 1, {1,1});
469 else if (inputShape.size() == 3) {
471 inputShape.insert(inputShape.begin() + 2, 1);
487 size_t batchDepth = 0;
488 size_t batchHeight = 0;
489 size_t batchWidth = 0;
493 TIter nextBatchDim(batchDimStrings);
497 for (; batchDimString !=
nullptr; batchDimString = (
TObjString *)nextBatchDim()) {
502 batchDepth = (size_t)strDepth.
Atoi();
507 batchHeight = (size_t)strHeight.
Atoi();
512 batchWidth = (size_t)strWidth.
Atoi();
525template <
typename Architecture_t,
typename Layer_t>
530 const TString layerDelimiter(
",");
531 const TString subDelimiter(
"|");
539 TIter nextLayer(layerStrings);
543 for (; layerString !=
nullptr; layerString = (
TObjString *)nextLayer()) {
547 TIter nextToken(subStrings);
554 if (strLayerType ==
"DENSE") {
556 }
else if (strLayerType ==
"CONV") {
558 }
else if (strLayerType ==
"MAXPOOL") {
560 }
else if (strLayerType ==
"RESHAPE") {
562 }
else if (strLayerType ==
"BNORM") {
564 }
else if (strLayerType ==
"RNN") {
566 }
else if (strLayerType ==
"LSTM") {
568 }
else if (strLayerType ==
"GRU") {
579template <
typename Architecture_t,
typename Layer_t>
590 const size_t inputSize =
GetNvar();
594 TIter nextToken(subStrings);
601 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
606 if (strActFnc ==
"DENSE")
continue;
608 if (strActFnc ==
"RELU") {
610 }
else if (strActFnc ==
"TANH") {
612 }
else if (strActFnc ==
"FTANH") {
614 }
else if (strActFnc ==
"SYMMRELU") {
616 }
else if (strActFnc ==
"SOFTSIGN") {
618 }
else if (strActFnc ==
"SIGMOID") {
620 }
else if (strActFnc ==
"LINEAR") {
622 }
else if (strActFnc ==
"GAUSS") {
624 }
else if (
width == 0) {
628 TString strNumNodes = strActFnc;
639 size_t outputSize = 1;
667template <
typename Architecture_t,
typename Layer_t>
677 int zeroPadHeight = 0;
678 int zeroPadWidth = 0;
683 TIter nextToken(subStrings);
687 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
692 depth = strDepth.
Atoi();
697 fltHeight = strFltHeight.
Atoi();
702 fltWidth = strFltWidth.
Atoi();
707 strideRows = strStrideRows.
Atoi();
712 strideCols = strStrideCols.
Atoi();
717 zeroPadHeight = strZeroPadHeight.
Atoi();
722 zeroPadWidth = strZeroPadWidth.
Atoi();
727 if (strActFnc ==
"RELU") {
729 }
else if (strActFnc ==
"TANH") {
731 }
else if (strActFnc ==
"SYMMRELU") {
733 }
else if (strActFnc ==
"SOFTSIGN") {
735 }
else if (strActFnc ==
"SIGMOID") {
737 }
else if (strActFnc ==
"LINEAR") {
739 }
else if (strActFnc ==
"GAUSS") {
749 zeroPadHeight, zeroPadWidth, activationFunction);
753 if (
fBuildNet)
fNet->AddConvLayer(depth, fltHeight, fltWidth, strideRows, strideCols,
754 zeroPadHeight, zeroPadWidth, activationFunction);
766template <
typename Architecture_t,
typename Layer_t>
772 int filterHeight = 0;
779 TIter nextToken(subStrings);
783 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
788 filterHeight = strFrmHeight.
Atoi();
793 filterWidth = strFrmWidth.
Atoi();
798 strideRows = strStrideRows.
Atoi();
803 strideCols = strStrideCols.
Atoi();
811 deepNet.
AddMaxPoolLayer(filterHeight, filterWidth, strideRows, strideCols);
814 if (
fBuildNet)
fNet->AddMaxPoolLayer(filterHeight, filterWidth, strideRows, strideCols);
827template <
typename Architecture_t,
typename Layer_t>
835 bool flattening =
false;
839 TIter nextToken(subStrings);
843 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
844 if (token->
GetString() ==
"FLAT") idxToken=4;
848 depth = strDepth.
Atoi();
853 height = strHeight.
Atoi();
863 if (flat ==
"FLAT") {
888template <
typename Architecture_t,
typename Layer_t>
895 double momentum = -1;
900 TIter nextToken(subStrings);
904 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
929template <
typename Architecture_t,
typename Layer_t>
938 bool rememberState =
false;
939 bool returnSequence =
false;
940 bool resetGateAfter =
false;
944 TIter nextToken(subStrings);
948 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
953 stateSize = strstateSize.
Atoi();
959 inputSize = strinputSize.
Atoi();
965 timeSteps = strtimeSteps.
Atoi();
971 rememberState = (
bool) strrememberState.
Atoi();
991 auto * recurrentLayer = deepNet.
AddBasicRNNLayer(stateSize, inputSize, timeSteps, rememberState, returnSequence);
992 recurrentLayer->Initialize();
994 if (
fBuildNet)
fNet->AddBasicRNNLayer(stateSize, inputSize, timeSteps, rememberState, returnSequence);
997 auto *recurrentLayer = deepNet.
AddBasicLSTMLayer(stateSize, inputSize, timeSteps, rememberState, returnSequence);
998 recurrentLayer->Initialize();
1001 fNet->AddBasicLSTMLayer(stateSize, inputSize, timeSteps, rememberState, returnSequence);
1004 if (Architecture_t::IsCudnn()) resetGateAfter =
true;
1005 auto *recurrentLayer = deepNet.
AddBasicGRULayer(stateSize, inputSize, timeSteps, rememberState, returnSequence, resetGateAfter);
1006 recurrentLayer->Initialize();
1009 fNet->AddBasicGRULayer(stateSize, inputSize, timeSteps, rememberState, returnSequence, resetGateAfter);
1012 Log() << kFATAL <<
"Invalid Recurrent layer type " <<
Endl;
1019 :
MethodBase(jobName,
Types::kDL, methodTitle, theData, theOption), fInputShape(4,0),
1020 fBatchHeight(), fBatchWidth(), fRandomSeed(0), fWeightInitialization(),
1021 fOutputFunction(), fLossFunction(), fInputLayoutString(), fBatchLayoutString(),
1022 fLayoutString(), fErrorStrategy(), fTrainingStrategyString(), fWeightInitializationString(),
1023 fArchitectureString(), fResume(false), fBuildNet(true), fTrainingSettings(),
1032 :
MethodBase(
Types::kDL, theData, theWeightFile), fInputShape(4,0), fBatchHeight(),
1033 fBatchWidth(), fRandomSeed(0), fWeightInitialization(), fOutputFunction(),
1034 fLossFunction(), fInputLayoutString(), fBatchLayoutString(), fLayoutString(),
1035 fErrorStrategy(), fTrainingStrategyString(), fWeightInitializationString(),
1036 fArchitectureString(), fResume(false), fBuildNet(true), fTrainingSettings(),
1054 parseString.ReplaceAll(
" ",
"");
1056 const TString keyValueDelim(
"=");
1058 TObjArray *blockStrings = parseString.Tokenize(blockDelim);
1059 TIter nextBlock(blockStrings);
1062 for (; blockString !=
nullptr; blockString = (
TObjString *)nextBlock()) {
1063 blockKeyValues.push_back(std::map<TString, TString>());
1064 std::map<TString, TString> ¤tBlock = blockKeyValues.back();
1067 TIter nextToken(subStrings);
1070 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
1072 int delimPos = strKeyValue.
First(keyValueDelim.
Data());
1073 if (delimPos <= 0)
continue;
1082 currentBlock.insert(std::make_pair(strKey, strValue));
1085 return blockKeyValues;
1109 Int_t nValidationSamples = 0;
1114 if (fNumValidationString.EndsWith(
"%")) {
1119 Double_t valSizeAsDouble = fNumValidationString.Atof() / 100.0;
1120 nValidationSamples = GetEventCollection(
Types::kTraining).size() * valSizeAsDouble;
1122 Log() << kFATAL <<
"Cannot parse number \"" << fNumValidationString
1123 <<
"\". Expected string like \"20%\" or \"20.0%\"." <<
Endl;
1125 }
else if (fNumValidationString.IsFloat()) {
1126 Double_t valSizeAsDouble = fNumValidationString.Atof();
1128 if (valSizeAsDouble < 1.0) {
1130 nValidationSamples = GetEventCollection(
Types::kTraining).size() * valSizeAsDouble;
1133 nValidationSamples = valSizeAsDouble;
1136 Log() << kFATAL <<
"Cannot parse number \"" << fNumValidationString <<
"\". Expected string like \"0.2\" or \"100\"."
1142 if (nValidationSamples < 0) {
1143 Log() << kFATAL <<
"Validation size \"" << fNumValidationString <<
"\" is negative." <<
Endl;
1146 if (nValidationSamples == 0) {
1147 Log() << kFATAL <<
"Validation size \"" << fNumValidationString <<
"\" is zero." <<
Endl;
1150 if (nValidationSamples >= (
Int_t)trainingSetSize) {
1151 Log() << kFATAL <<
"Validation size \"" << fNumValidationString
1152 <<
"\" is larger than or equal in size to training set (size=\"" << trainingSetSize <<
"\")." <<
Endl;
1155 return nValidationSamples;
1162template <
typename Architecture_t>
1166 using Scalar_t =
typename Architecture_t::Scalar_t;
1184 const std::vector<TMVA::Event *> eventCollectionTraining{allData.begin(), allData.begin() + nTrainingSamples};
1185 const std::vector<TMVA::Event *> eventCollectionValidation{allData.begin() + nTrainingSamples, allData.end()};
1187 size_t trainingPhase = 1;
1191 size_t nThreads = 1;
1195 size_t batchSize = settings.batchSize;
1216 if (batchDepth != batchSize && batchDepth > 1) {
1217 Error(
"Train",
"Given batch depth of %zu (specified in BatchLayout) should be equal to given batch size %zu",batchDepth,batchSize);
1220 if (batchDepth == 1 && batchSize > 1 && batchSize != batchHeight ) {
1221 Error(
"Train",
"Given batch height of %zu (specified in BatchLayout) should be equal to given batch size %zu",batchHeight,batchSize);
1227 bool badLayout =
false;
1229 if (batchDepth == batchSize)
1230 badLayout = ( inputDepth * inputHeight * inputWidth != batchHeight * batchWidth ) ;
1232 if (batchHeight == batchSize && batchDepth == 1)
1233 badLayout |= ( inputDepth * inputHeight * inputWidth != batchWidth);
1235 Error(
"Train",
"Given input layout %zu x %zu x %zu is not compatible with batch layout %zu x %zu x %zu ",
1236 inputDepth,inputHeight,inputWidth,batchDepth,batchHeight,batchWidth);
1241 if (nTrainingSamples < settings.batchSize || nValidationSamples < settings.batchSize) {
1242 Log() << kFATAL <<
"Number of samples in the datasets are train: ("
1243 << nTrainingSamples <<
") test: (" << nValidationSamples
1244 <<
"). One of these is smaller than the batch size of "
1245 << settings.batchSize <<
". Please increase the batch"
1246 <<
" size to be at least the same size as the smallest"
1247 <<
" of them." <<
Endl;
1250 DeepNet_t deepNet(batchSize, inputDepth, inputHeight, inputWidth, batchDepth, batchHeight, batchWidth, J,
I,
R,
weightDecay);
1254 if (trainingPhase == 1) {
1255 fNet = std::unique_ptr<DeepNetImpl_t>(
new DeepNetImpl_t(1, inputDepth, inputHeight, inputWidth, batchDepth,
1263 std::vector<DeepNet_t> nets{};
1264 nets.reserve(nThreads);
1265 for (
size_t i = 0; i < nThreads; i++) {
1267 nets.push_back(deepNet);
1277 std::vector<Double_t> dropoutVector(settings.dropoutProbabilities);
1278 for (
auto & p : dropoutVector) {
1281 deepNet.SetDropoutProbabilities(dropoutVector);
1283 if (trainingPhase > 1) {
1285 for (
size_t i = 0; i < deepNet.GetDepth(); ++i) {
1286 deepNet.GetLayerAt(i)->CopyParameters(*
fNet->GetLayerAt(i));
1307 Log() <<
"***** Deep Learning Network *****" <<
Endl;
1308 if (
Log().GetMinType() <= kINFO)
1311 Log() <<
"Using " << nTrainingSamples <<
" events for training and " << nValidationSamples <<
" for testing" <<
Endl;
1315 TensorDataLoader_t trainingData(trainingTuple, nTrainingSamples, batchSize,
1316 {inputDepth, inputHeight, inputWidth},
1317 {deepNet.GetBatchDepth(), deepNet.GetBatchHeight(), deepNet.GetBatchWidth()} ,
1318 deepNet.GetOutputWidth(), nThreads);
1321 TensorDataLoader_t validationData(validationTuple, nValidationSamples, batchSize,
1322 {inputDepth, inputHeight, inputWidth},
1323 { deepNet.GetBatchDepth(),deepNet.GetBatchHeight(), deepNet.GetBatchWidth()} ,
1324 deepNet.GetOutputWidth(), nThreads);
1333 Log() <<
"Compute initial loss on the validation data " <<
Endl;
1334 for (
auto batch : validationData) {
1335 auto inputTensor = batch.GetInput();
1336 auto outputMatrix = batch.GetOutput();
1337 auto weights = batch.GetWeights();
1341 minValError += deepNet.Loss(inputTensor, outputMatrix, weights,
false, includeRegularization);
1344 Double_t regzTerm = (includeRegularization) ? deepNet.RegularizationTerm() : 0.0;
1345 minValError /= (
Double_t)(nValidationSamples / settings.batchSize);
1346 minValError += regzTerm;
1350 std::unique_ptr<DNN::VOptimizer<Architecture_t, Layer_t, DeepNet_t>> optimizer;
1355 case EOptimizer::kSGD:
1356 optimizer = std::unique_ptr<DNN::TSGD<Architecture_t, Layer_t, DeepNet_t>>(
1360 case EOptimizer::kAdam:
1361 optimizer = std::unique_ptr<DNN::TAdam<Architecture_t, Layer_t, DeepNet_t>>(
1365 case EOptimizer::kAdagrad:
1366 optimizer = std::unique_ptr<DNN::TAdagrad<Architecture_t, Layer_t, DeepNet_t>>(
1370 case EOptimizer::kRMSProp:
1371 optimizer = std::unique_ptr<DNN::TRMSProp<Architecture_t, Layer_t, DeepNet_t>>(
1375 case EOptimizer::kAdadelta:
1376 optimizer = std::unique_ptr<DNN::TAdadelta<Architecture_t, Layer_t, DeepNet_t>>(
1383 std::vector<TTensorBatch<Architecture_t>> batches{};
1385 bool converged =
false;
1386 size_t convergenceCount = 0;
1387 size_t batchesInEpoch = nTrainingSamples / deepNet.GetBatchSize();
1390 std::chrono::time_point<std::chrono::system_clock> tstart, tend;
1391 tstart = std::chrono::system_clock::now();
1394 <<
" Optimizer " << settings.optimizerName
1395 <<
" Learning rate = " << settings.learningRate
1396 <<
" regularization " << (char) settings.regularization
1397 <<
" minimum error = " << minValError
1402 Log() << std::setw(10) <<
"Epoch"
1403 <<
" | " << std::setw(12) <<
"Train Err." << std::setw(12) <<
"Val. Err."
1404 << std::setw(12) <<
"t(s)/epoch" << std::setw(12) <<
"t(s)/Loss"
1405 << std::setw(12) <<
"nEvents/s"
1406 << std::setw(12) <<
"Conv. Steps" <<
Endl;
1412 size_t shuffleSeed = 0;
1418 Log() <<
"Initial Deep Net Weights " <<
Endl;
1419 auto & weights_tensor = deepNet.GetLayerAt(0)->GetWeights();
1420 for (
size_t l = 0;
l < weights_tensor.size(); ++
l)
1421 weights_tensor[
l].
Print();
1422 auto & bias_tensor = deepNet.GetLayerAt(0)->GetBiases();
1423 bias_tensor[0].Print();
1426 Log() <<
" Start epoch iteration ..." <<
Endl;
1427 bool debugFirstEpoch =
false;
1428 bool computeLossInTraining =
true;
1429 size_t nTrainEpochs = 0;
1430 while (!converged) {
1432 trainingData.Shuffle(rng);
1438 for (
size_t i = 0; i < batchesInEpoch; ++i ) {
1445 if (debugFirstEpoch) std::cout <<
"\n\n----- batch # " << i <<
"\n\n";
1447 auto my_batch = trainingData.GetTensorBatch();
1449 if (debugFirstEpoch)
1450 std::cout <<
"got batch data - doing forward \n";
1454 Architecture_t::PrintTensor(my_batch.GetInput(),
"input tensor",
true);
1455 typename Architecture_t::Tensor_t tOut(my_batch.GetOutput());
1456 typename Architecture_t::Tensor_t tW(my_batch.GetWeights());
1457 Architecture_t::PrintTensor(tOut,
"label tensor",
true) ;
1458 Architecture_t::PrintTensor(tW,
"weight tensor",
true) ;
1461 deepNet.Forward(my_batch.GetInput(),
true);
1463 if (computeLossInTraining) {
1464 auto outputMatrix = my_batch.GetOutput();
1465 auto weights = my_batch.GetWeights();
1466 trainingError += deepNet.Loss(outputMatrix, weights,
false);
1469 if (debugFirstEpoch)
1470 std::cout <<
"- doing backward \n";
1473 size_t nlayers = deepNet.GetLayers().size();
1474 for (
size_t l = 0;
l < nlayers; ++
l) {
1475 if (deepNet.GetLayerAt(
l)->GetWeights().size() > 0)
1476 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetWeightsAt(0),
1479 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetOutput(),
1486 deepNet.Backward(my_batch.GetInput(), my_batch.GetOutput(), my_batch.GetWeights());
1488 if (debugFirstEpoch)
1489 std::cout <<
"- doing optimizer update \n";
1492 optimizer->IncrementGlobalStep();
1496 std::cout <<
"minmimizer step - momentum " << settings.momentum <<
" learning rate " << optimizer->GetLearningRate() << std::endl;
1497 for (
size_t l = 0;
l < nlayers; ++
l) {
1498 if (deepNet.GetLayerAt(
l)->GetWeights().size() > 0) {
1499 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetWeightsAt(0),
TString::Format(
"weights after step layer %d",
l).
Data());
1500 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetWeightGradientsAt(0),
"weight gradients");
1507 if (debugFirstEpoch) std::cout <<
"\n End batch loop - compute validation loss \n";
1509 debugFirstEpoch =
false;
1510 if ((nTrainEpochs % settings.testInterval) == 0) {
1512 std::chrono::time_point<std::chrono::system_clock>
t1,t2;
1514 t1 = std::chrono::system_clock::now();
1520 bool inTraining =
false;
1521 for (
auto batch : validationData) {
1522 auto inputTensor = batch.GetInput();
1523 auto outputMatrix = batch.GetOutput();
1524 auto weights = batch.GetWeights();
1526 valError += deepNet.Loss(inputTensor, outputMatrix, weights, inTraining, includeRegularization);
1529 Double_t regTerm = (includeRegularization) ? deepNet.RegularizationTerm() : 0.0;
1530 valError /= (
Double_t)(nValidationSamples / settings.batchSize);
1531 valError += regTerm;
1536 t2 = std::chrono::system_clock::now();
1539 if (valError < minValError) {
1540 convergenceCount = 0;
1542 convergenceCount += settings.testInterval;
1546 if (valError < minValError ) {
1548 Log() << std::setw(10) << nTrainEpochs
1549 <<
" Minimum Test error found - save the configuration " <<
Endl;
1550 for (
size_t i = 0; i < deepNet.GetDepth(); ++i) {
1551 fNet->GetLayerAt(i)->CopyParameters(*deepNet.GetLayerAt(i));
1560 minValError = valError;
1562 else if ( minValError <= 0. )
1563 minValError = valError;
1565 if (!computeLossInTraining) {
1566 trainingError = 0.0;
1568 for (
auto batch : trainingData) {
1569 auto inputTensor = batch.GetInput();
1570 auto outputMatrix = batch.GetOutput();
1571 auto weights = batch.GetWeights();
1572 trainingError += deepNet.Loss(inputTensor, outputMatrix, weights,
false,
false);
1576 trainingError /= (
Double_t)(nTrainingSamples / settings.batchSize);
1577 trainingError += regTerm;
1583 tend = std::chrono::system_clock::now();
1586 std::chrono::duration<double> elapsed_seconds = tend - tstart;
1587 std::chrono::duration<double> elapsed1 =
t1-tstart;
1590 std::chrono::duration<double> elapsed_testing = tend-
t1;
1592 double seconds = elapsed_seconds.count();
1595 double eventTime = elapsed1.count()/( batchesInEpoch * settings.testInterval * settings.batchSize);
1598 convergenceCount > settings.convergenceSteps || nTrainEpochs >= settings.maxEpochs;
1601 Log() << std::setw(10) << nTrainEpochs <<
" | "
1602 << std::setw(12) << trainingError
1603 << std::setw(12) << valError
1604 << std::setw(12) << seconds / settings.testInterval
1605 << std::setw(12) << elapsed_testing.count()
1606 << std::setw(12) << 1. / eventTime
1607 << std::setw(12) << convergenceCount
1613 tstart = std::chrono::system_clock::now();
1617 if (converged && debug) {
1618 Log() <<
"Final Deep Net Weights for phase " << trainingPhase <<
" epoch " << nTrainEpochs
1620 auto & weights_tensor = deepNet.GetLayerAt(0)->GetWeights();
1621 auto & bias_tensor = deepNet.GetLayerAt(0)->GetBiases();
1622 for (
size_t l = 0;
l < weights_tensor.size(); ++
l)
1623 weights_tensor[
l].
Print();
1624 bias_tensor[0].Print();
1637 Log() << kFATAL <<
"Not implemented yet" <<
Endl;
1643#ifdef R__HAS_TMVAGPU
1644 Log() << kINFO <<
"Start of deep neural network training on GPU." <<
Endl <<
Endl;
1646 TrainDeepNet<DNN::TCudnn<ScalarImpl_t> >();
1648 TrainDeepNet<DNN::TCuda<ScalarImpl_t>>();
1651 Log() << kFATAL <<
"CUDA backend not enabled. Please make sure "
1652 "you have CUDA installed and it was successfully "
1653 "detected by CMAKE."
1658#ifdef R__HAS_TMVACPU
1661 Log() << kINFO <<
"Start of deep neural network training on CPU using MT, nthreads = "
1664 Log() << kINFO <<
"Start of deep neural network training on single thread CPU (without ROOT-MT support) " <<
Endl
1667 TrainDeepNet<DNN::TCpu<ScalarImpl_t> >();
1672 " is not a supported architecture for TMVA::MethodDL"
1685 if (!
fNet ||
fNet->GetDepth() == 0) {
1686 Log() << kFATAL <<
"The network has not been trained and fNet is not built"
1708 if (
fXInput.GetShape().size() == 2) {
1712 Log() << kFATAL <<
"First tensor dimension should be equal to batch size, i.e. = 1"
1720 if ( nVariables != nc * nhw) {
1721 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1722 <<
" n-event variables " << nVariables <<
" expected input tensor " << nc <<
" x " << nhw
1725 for (
size_t j = 0; j < nc; j++) {
1726 for (
size_t k = 0; k < nhw; k++) {
1733 assert(
fXInput.GetShape().size() >= 4);
1734 size_t nc =
fXInput.GetCSize();
1735 size_t nh =
fXInput.GetHSize();
1736 size_t nw =
fXInput.GetWSize();
1737 size_t n = nc * nh * nw;
1738 if ( nVariables !=
n) {
1739 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1740 <<
" n-event variables " << nVariables <<
" expected input tensor " << nc <<
" x " << nh <<
" x " << nw
1743 for (
size_t j = 0; j <
n; j++) {
1755 double mvaValue = (*fYHat)(0, 0);
1758#ifdef DEBUG_MVAVALUE
1759 using Tensor_t = std::vector<MatrixImpl_t>;
1760 TMatrixF xInput(n1,n2, inputValues.data() );
1763 std::cout <<
"Output of DeepNet " << mvaValue << std::endl;
1764 auto & deepnet = *
fNet;
1765 std::cout <<
"Loop on layers " << std::endl;
1766 for (
int l = 0;
l < deepnet.GetDepth(); ++
l) {
1767 std::cout <<
"Layer " <<
l;
1768 const auto * layer = deepnet.GetLayerAt(
l);
1769 const Tensor_t & layer_output = layer->GetOutput();
1771 std::cout <<
"DNN output " << layer_output.size() << std::endl;
1772 for (
size_t i = 0; i < layer_output.size(); ++i) {
1773#ifdef R__HAS_TMVAGPU
1777 TMatrixD m(layer_output[i].GetNrows(), layer_output[i].GetNcols() , layer_output[i].GetRawDataPointer() );
1781 const Tensor_t & layer_weights = layer->GetWeights();
1782 std::cout <<
"DNN weights " << layer_weights.size() << std::endl;
1783 if (layer_weights.size() > 0) {
1785#ifdef R__HAS_TMVAGPU
1789 TMatrixD m(layer_weights[i].GetNrows(), layer_weights[i].GetNcols() , layer_weights[i].GetRawDataPointer() );
1801template <
typename Architecture_t>
1806 if (!
fNet ||
fNet->GetDepth() == 0) {
1807 Log() << kFATAL <<
"The network has not been trained and fNet is not built"
1825 using Matrix_t =
typename Architecture_t::Matrix_t;
1829 DeepNet_t deepNet(batchSize, inputDepth, inputHeight, inputWidth, batchDepth, batchHeight, batchWidth, J,
I,
R,
weightDecay);
1830 std::vector<DeepNet_t> nets{};
1835 for (
size_t i = 0; i < deepNet.GetDepth(); ++i) {
1836 deepNet.GetLayerAt(i)->CopyParameters(*
fNet->GetLayerAt(i));
1843 size_t n1 = deepNet.GetBatchHeight();
1844 size_t n2 = deepNet.GetBatchWidth();
1845 size_t n0 = deepNet.GetBatchSize();
1848 n1 = deepNet.GetBatchSize();
1852 Long64_t nEvents = lastEvt - firstEvt;
1854 TensorDataLoader_t testData(testTuple, nEvents, batchSize, {inputDepth, inputHeight, inputWidth}, {n0, n1, n2}, deepNet.GetOutputWidth(), 1);
1862 Matrix_t yHat(deepNet.GetBatchSize(), deepNet.GetOutputWidth() );
1871 <<
" sample (" << nEvents <<
" events)" <<
Endl;
1875 std::vector<double> mvaValues(nEvents);
1878 for (
Long64_t ievt = firstEvt; ievt < lastEvt; ievt+=batchSize) {
1880 Long64_t ievt_end = ievt + batchSize;
1882 if (ievt_end <= lastEvt) {
1884 if (ievt == firstEvt) {
1888 if (n1 == batchSize && n0 == 1) {
1889 if (n2 != nVariables) {
1890 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1891 <<
" n-event variables " << nVariables <<
" expected input matrix " << n1 <<
" x " << n2
1895 if (n1*n2 != nVariables || n0 != batchSize) {
1896 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1897 <<
" n-event variables " << nVariables <<
" expected input tensor " << n0 <<
" x " << n1 <<
" x " << n2
1903 auto batch = testData.GetTensorBatch();
1904 auto inputTensor = batch.GetInput();
1906 auto xInput = batch.GetInput();
1909 for (
size_t i = 0; i < batchSize; ++i) {
1910 double value = yHat(i,0);
1911 mvaValues[ievt + i] = (
TMath::IsNaN(value)) ? -999. : value;
1916 for (
Long64_t i = ievt; i < lastEvt; ++i) {
1925 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
1934 size_t nVariables = GetEvent()->GetNVariables();
1937 const Event *ev = GetEvent();
1938 const std::vector<Float_t>& inputValues = ev->
GetValues();
1939 for (
size_t i = 0; i < nVariables; i++) {
1940 X_vec(0,i,0) = inputValues[i];
1944 size_t nTargets = std::max(1u, ev->
GetNTargets());
1946 std::vector<Float_t>
output(nTargets);
1947 fNet->Prediction(YHat, X_vec, fOutputFunction);
1949 for (
size_t i = 0; i < nTargets; i++)
1952 if (fRegressionReturnVal == NULL) {
1953 fRegressionReturnVal =
new std::vector<Float_t>();
1955 fRegressionReturnVal->clear();
1958 for (
size_t i = 0; i < nTargets; ++i) {
1962 const Event* evT2 = GetTransformationHandler().InverseTransform(evT);
1963 for (
size_t i = 0; i < nTargets; ++i) {
1964 fRegressionReturnVal->push_back(evT2->
GetTarget(i));
1967 return *fRegressionReturnVal;
1972 size_t nVariables = GetEvent()->GetNVariables();
1976 if (fMulticlassReturnVal == NULL) {
1977 fMulticlassReturnVal =
new std::vector<Float_t>(DataInfo().GetNClasses());
1980 const std::vector<Float_t>& inputValues = GetEvent()->GetValues();
1981 for (
size_t i = 0; i < nVariables; i++) {
1982 X_vec(0,i, 0) = inputValues[i];
1985 fNet->Prediction(YHat, X_vec, fOutputFunction);
1986 for (
size_t i = 0; i < (size_t) YHat.GetNcols(); i++) {
1987 (*fMulticlassReturnVal)[i] = YHat(0, i);
1989 return *fMulticlassReturnVal;
2008 if (firstEvt > lastEvt || lastEvt > nEvents) lastEvt = nEvents;
2009 if (firstEvt < 0) firstEvt = 0;
2010 nEvents = lastEvt-firstEvt;
2013 size_t defaultEvalBatchSize = (
fXInput.GetSize() > 1000) ? 100 : 1000;
2015 if (
size_t(nEvents) < batchSize ) batchSize = nEvents;
2019#ifdef R__HAS_TMVAGPU
2020 Log() << kINFO <<
"Evaluate deep neural network on GPU using batches with size = " << batchSize <<
Endl <<
Endl;
2022 return PredictDeepNet<DNN::TCudnn<ScalarImpl_t>>(firstEvt, lastEvt, batchSize, logProgress);
2024 return PredictDeepNet<DNN::TCuda<ScalarImpl_t>>(firstEvt, lastEvt, batchSize, logProgress);
2029 Log() << kINFO <<
"Evaluate deep neural network on CPU using batches with size = " << batchSize <<
Endl <<
Endl;
2030 return PredictDeepNet<DNN::TCpu<ScalarImpl_t> >(firstEvt, lastEvt, batchSize, logProgress);
2037 void* nn = xmlEngine.
NewChild(parent, 0,
"Weights");
2045 Int_t inputDepth =
fNet->GetInputDepth();
2046 Int_t inputHeight =
fNet->GetInputHeight();
2047 Int_t inputWidth =
fNet->GetInputWidth();
2051 Int_t batchDepth =
fNet->GetBatchDepth();
2052 Int_t batchHeight =
fNet->GetBatchHeight();
2053 Int_t batchWidth =
fNet->GetBatchWidth();
2055 char lossFunction =
static_cast<char>(
fNet->GetLossFunction());
2056 char initialization =
static_cast<char>(
fNet->GetInitialization());
2077 xmlEngine.NewAttr(nn, 0,
"LossFunction",
TString(lossFunction));
2078 xmlEngine.NewAttr(nn, 0,
"Initialization",
TString(initialization));
2080 xmlEngine.NewAttr(nn, 0,
"OutputFunction",
TString(outputFunction));
2085 for (
Int_t i = 0; i < depth; i++)
2105 size_t inputDepth, inputHeight, inputWidth;
2110 size_t batchSize, batchDepth, batchHeight, batchWidth;
2118 char lossFunctionChar;
2120 char initializationChar;
2122 char regularizationChar;
2124 char outputFunctionChar;
2141 fNet = std::unique_ptr<DeepNetImpl_t>(
new DeepNetImpl_t(batchSize, inputDepth, inputHeight, inputWidth, batchDepth,
2142 batchHeight, batchWidth,
2155 for (
size_t i = 0; i < netDepth; i++) {
2160 if (layerName ==
"DenseLayer") {
2176 else if (layerName ==
"ConvLayer") {
2181 size_t fltHeight, fltWidth = 0;
2182 size_t strideRows, strideCols = 0;
2183 size_t padHeight, padWidth = 0;
2197 fNet->AddConvLayer(depth, fltHeight, fltWidth, strideRows, strideCols,
2198 padHeight, padWidth, actFunction);
2203 else if (layerName ==
"MaxPoolLayer") {
2206 size_t filterHeight, filterWidth = 0;
2207 size_t strideRows, strideCols = 0;
2213 fNet->AddMaxPoolLayer(filterHeight, filterWidth, strideRows, strideCols);
2216 else if (layerName ==
"ReshapeLayer") {
2219 size_t depth, height,
width = 0;
2226 fNet->AddReshapeLayer(depth, height,
width, flattening);
2230 else if (layerName ==
"RNNLayer") {
2233 size_t stateSize,inputSize, timeSteps = 0;
2234 int rememberState= 0;
2235 int returnSequence = 0;
2242 fNet->AddBasicRNNLayer(stateSize, inputSize, timeSteps, rememberState, returnSequence);
2246 else if (layerName ==
"LSTMLayer") {
2249 size_t stateSize,inputSize, timeSteps = 0;
2250 int rememberState, returnSequence = 0;
2257 fNet->AddBasicLSTMLayer(stateSize, inputSize, timeSteps, rememberState, returnSequence);
2261 else if (layerName ==
"GRULayer") {
2264 size_t stateSize,inputSize, timeSteps = 0;
2265 int rememberState, returnSequence, resetGateAfter = 0;
2275 "Cannot use a reset gate after to false with CudNN - use implementation with resetgate=true");
2277 fNet->AddBasicGRULayer(stateSize, inputSize, timeSteps, rememberState, returnSequence, resetGateAfter);
2280 else if (layerName ==
"BatchNormLayer") {
2282 fNet->AddBatchNormLayer(0., 0.0);
2285 fNet->GetLayers().back()->ReadWeightsFromXML(layerXML);
#define REGISTER_METHOD(CLASS)
for example
include TDocParser_001 C image html pict1_TDocParser_001 png width
char * Form(const char *fmt,...)
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
void AddPreDefVal(const T &)
Adadelta Optimizer class.
static void PrintTensor(const Tensor_t &A, const std::string name="Cpu-tensor", bool truncate=false)
static Tensor_t CreateTensor(size_t n, size_t c, size_t h, size_t w)
Generic Deep Neural Network class.
TBatchNormLayer< Architecture_t > * AddBatchNormLayer(Scalar_t momentum=-1, Scalar_t epsilon=0.0001)
Function for adding a Batch Normalization layer with given parameters.
TBasicGRULayer< Architecture_t > * AddBasicGRULayer(size_t stateSize, size_t inputSize, size_t timeSteps, bool rememberState=false, bool returnSequence=false, bool resetGateAfter=false)
Function for adding GRU Layer in the Deep Neural Network, with given parameters.
TDenseLayer< Architecture_t > * AddDenseLayer(size_t width, EActivationFunction f, Scalar_t dropoutProbability=1.0)
Function for adding Dense Connected Layer in the Deep Neural Network, with a given width,...
TBasicLSTMLayer< Architecture_t > * AddBasicLSTMLayer(size_t stateSize, size_t inputSize, size_t timeSteps, bool rememberState=false, bool returnSequence=false)
Function for adding LSTM Layer in the Deep Neural Network, with given parameters.
TMaxPoolLayer< Architecture_t > * AddMaxPoolLayer(size_t frameHeight, size_t frameWidth, size_t strideRows, size_t strideCols, Scalar_t dropoutProbability=1.0)
Function for adding Pooling layer in the Deep Neural Network, with a given filter height and width,...
TConvLayer< Architecture_t > * AddConvLayer(size_t depth, size_t filterHeight, size_t filterWidth, size_t strideRows, size_t strideCols, size_t paddingHeight, size_t paddingWidth, EActivationFunction f, Scalar_t dropoutProbability=1.0)
Function for adding Convolution layer in the Deep Neural Network, with a given depth,...
TReshapeLayer< Architecture_t > * AddReshapeLayer(size_t depth, size_t height, size_t width, bool flattening)
Function for adding Reshape Layer in the Deep Neural Network, with a given height and width.
TBasicRNNLayer< Architecture_t > * AddBasicRNNLayer(size_t stateSize, size_t inputSize, size_t timeSteps, bool rememberState=false, bool returnSequence=false, EActivationFunction f=EActivationFunction::kTanh)
Function for adding Recurrent Layer in the Deep Neural Network, with given parameters.
Stochastic Batch Gradient Descent Optimizer class.
Generic General Layer class.
virtual void Initialize()
Initialize the weights and biases according to the given initialization method.
Class that contains all the data information.
UInt_t GetNClasses() const
Types::ETreeType GetCurrentType() const
Long64_t GetNEvents(Types::ETreeType type=Types::kMaxTreeType) const
void SetCurrentEvent(Long64_t ievt) const
void SetTarget(UInt_t itgt, Float_t value)
set the target value (dimension itgt) to value
UInt_t GetNVariables() const
accessor to the number of variables
UInt_t GetNTargets() const
accessor to the number of targets
std::vector< Float_t > & GetValues()
Float_t GetTarget(UInt_t itgt) const
Virtual base Class for all MVA method.
const char * GetName() const
Bool_t IgnoreEventsWithNegWeightsInTraining() const
const std::vector< TMVA::Event * > & GetEventCollection(Types::ETreeType type)
returns the event collection (i.e.
UInt_t GetNTargets() const
const TString & GetMethodName() const
const Event * GetEvent() const
DataSetInfo & DataInfo() const
UInt_t GetNVariables() const
Types::EAnalysisType fAnalysisType
TrainingHistory fTrainHistory
IPythonInteractive * fInteractive
typename ArchitectureImpl_t::Tensor_t TensorImpl_t
size_t fBatchHeight
The height of the batch used to train the deep net.
void GetHelpMessage() const
DNN::ELossFunction fLossFunction
The loss function.
virtual const std::vector< Float_t > & GetMulticlassValues()
std::vector< size_t > fInputShape
Contains the batch size (no.
TString fLayoutString
The string defining the layout of the deep net.
void SetInputDepth(int inputDepth)
Setters.
std::unique_ptr< MatrixImpl_t > fYHat
void Train()
Methods for training the deep learning network.
size_t GetBatchHeight() const
virtual std::vector< Double_t > GetMvaValues(Long64_t firstEvt, Long64_t lastEvt, Bool_t logProgress)
Evaluate the DeepNet on a vector of input values stored in the TMVA Event class.
TString fWeightInitializationString
The string defining the weight initialization method.
void ParseMaxPoolLayer(DNN::TDeepNet< Architecture_t, Layer_t > &deepNet, std::vector< DNN::TDeepNet< Architecture_t, Layer_t > > &nets, TString layerString, TString delim)
Pases the layer string and creates the appropriate max pool layer.
size_t fRandomSeed
The random seed used to initialize the weights and shuffling batches (default is zero)
TString fArchitectureString
The string defining the architecure: CPU or GPU.
void Init()
default initializations
MethodDL(const TString &jobName, const TString &methodTitle, DataSetInfo &theData, const TString &theOption)
Constructor.
void TrainDeepNet()
train of deep neural network using the defined architecture
const std::vector< TTrainingSettings > & GetTrainingSettings() const
DNN::EOutputFunction GetOutputFunction() const
void ParseDenseLayer(DNN::TDeepNet< Architecture_t, Layer_t > &deepNet, std::vector< DNN::TDeepNet< Architecture_t, Layer_t > > &nets, TString layerString, TString delim)
Pases the layer string and creates the appropriate dense layer.
UInt_t GetNumValidationSamples()
parce the validation string and return the number of event data used for validation
TString GetBatchLayoutString() const
void SetInputWidth(int inputWidth)
HostBufferImpl_t fXInputBuffer
size_t fBatchWidth
The width of the batch used to train the deep net.
size_t GetInputDepth() const
virtual const std::vector< Float_t > & GetRegressionValues()
std::unique_ptr< DeepNetImpl_t > fNet
TString GetInputLayoutString() const
void SetBatchHeight(size_t batchHeight)
size_t GetInputHeight() const
TString GetArchitectureString() const
void ParseBatchLayout()
Parse the input layout.
void ParseBatchNormLayer(DNN::TDeepNet< Architecture_t, Layer_t > &deepNet, std::vector< DNN::TDeepNet< Architecture_t, Layer_t > > &nets, TString layerString, TString delim)
Pases the layer string and creates the appropriate reshape layer.
void ReadWeightsFromStream(std::istream &)
void ReadWeightsFromXML(void *wghtnode)
TString fNumValidationString
The string defining the number (or percentage) of training data used for validation.
std::vector< std::map< TString, TString > > KeyValueVector_t
DNN::EOutputFunction fOutputFunction
The output function for making the predictions.
DNN::EInitialization fWeightInitialization
The initialization method.
size_t GetBatchDepth() const
void ParseRecurrentLayer(ERecurrentLayerType type, DNN::TDeepNet< Architecture_t, Layer_t > &deepNet, std::vector< DNN::TDeepNet< Architecture_t, Layer_t > > &nets, TString layerString, TString delim)
Pases the layer string and creates the appropriate rnn layer.
std::vector< TTrainingSettings > fTrainingSettings
The vector defining each training strategy.
size_t GetInputWidth() const
void SetInputShape(std::vector< size_t > inputShape)
DNN::ELossFunction GetLossFunction() const
TString fBatchLayoutString
The string defining the layout of the batch.
Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets)
Check the type of analysis the deep learning network can do.
void ParseConvLayer(DNN::TDeepNet< Architecture_t, Layer_t > &deepNet, std::vector< DNN::TDeepNet< Architecture_t, Layer_t > > &nets, TString layerString, TString delim)
Pases the layer string and creates the appropriate convolutional layer.
void ParseReshapeLayer(DNN::TDeepNet< Architecture_t, Layer_t > &deepNet, std::vector< DNN::TDeepNet< Architecture_t, Layer_t > > &nets, TString layerString, TString delim)
Pases the layer string and creates the appropriate reshape layer.
TString fTrainingStrategyString
The string defining the training strategy.
const Ranking * CreateRanking()
typename ArchitectureImpl_t::HostBuffer_t HostBufferImpl_t
void SetBatchDepth(size_t batchDepth)
KeyValueVector_t ParseKeyValueString(TString parseString, TString blockDelim, TString tokenDelim)
Function for parsing the training settings, provided as a string in a key-value form.
void SetBatchWidth(size_t batchWidth)
std::vector< Double_t > PredictDeepNet(Long64_t firstEvt, Long64_t lastEvt, size_t batchSize, Bool_t logProgress)
perform prediction of the deep neural network using batches (called by GetMvaValues)
DNN::EInitialization GetWeightInitialization() const
void SetBatchSize(size_t batchSize)
TString GetLayoutString() const
size_t fBatchDepth
The depth of the batch used to train the deep net.
TMVA::DNN::TDeepNet< ArchitectureImpl_t > DeepNetImpl_t
size_t GetBatchWidth() const
void AddWeightsXMLTo(void *parent) const
typename ArchitectureImpl_t::Matrix_t MatrixImpl_t
Double_t GetMvaValue(Double_t *err=0, Double_t *errUpper=0)
virtual ~MethodDL()
Virtual Destructor.
void ParseInputLayout()
Parse the input layout.
bool fBuildNet
Flag to control whether to build fNet, the stored network used for the evaluation.
void SetInputHeight(int inputHeight)
void CreateDeepNet(DNN::TDeepNet< Architecture_t, Layer_t > &deepNet, std::vector< DNN::TDeepNet< Architecture_t, Layer_t > > &nets)
After calling the ProcesOptions(), all of the options are parsed, so using the parsed options,...
TString fErrorStrategy
The string defining the error strategy for training.
void DeclareOptions()
The option handling methods.
TString fInputLayoutString
The string defining the layout of the input.
EMsgType GetMinType() const
Ranking for variables in method (implementation)
Timing information for training and evaluation of MVA methods.
TString GetElapsedTime(Bool_t Scientific=kTRUE)
returns pretty string with elapsed time
void AddValue(TString Property, Int_t stage, Double_t value)
Singleton class for Global types used by TMVA.
void Print(Option_t *name="") const
Print the matrix as a table of elements.
virtual void Print(Option_t *option="") const
Print TNamed name and title.
Collectable string class.
const TString & GetString() const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Print(Option_t *option="") const
This method must be overridden when a class wants to print itself.
Int_t Atoi() const
Return integer value of string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
Double_t Atof() const
Return floating-point value contained in string.
Bool_t IsFloat() const
Returns kTRUE if string contains a floating point or integer number.
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
void ToUpper()
Change string to upper case.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
XMLNodePointer_t NewChild(XMLNodePointer_t parent, XMLNsPointer_t ns, const char *name, const char *content=nullptr)
create new child element for parent node
XMLNodePointer_t GetChild(XMLNodePointer_t xmlnode, Bool_t realnode=kTRUE)
returns first child of xmlnode
const char * GetNodeName(XMLNodePointer_t xmlnode)
returns name of xmlnode
EOptimizer
Enum representing the optimizer used for training.
EOutputFunction
Enum that represents output functions.
double weightDecay(double error, ItWeight itWeight, ItWeight itWeightEnd, double factorWeightDecay, EnumRegularization eRegularization)
compute the weight decay for regularization (L1 or L2)
auto regularization(const typename Architecture_t::Matrix_t &A, ERegularization R) -> decltype(Architecture_t::L1Regularization(A))
Evaluate the regularization functional for a given weight matrix.
ERegularization
Enum representing the regularization type applied for a given layer.
EActivationFunction
Enum that represents layer activation functions.
ELossFunction
Enum that represents objective functions for the net, i.e.
std::tuple< const std::vector< Event * > &, const DataSetInfo & > TMVAInput_t
create variable transformations
TString fetchValueTmp(const std::map< TString, TString > &keyValueMap, TString key)
MsgLogger & Endl(MsgLogger &ml)
All of the options that can be specified in the training string.
DNN::EOptimizer optimizer
DNN::ERegularization regularization
std::vector< Double_t > dropoutProbabilities
static void output(int code)