72 std::map<TString, TString>::const_iterator it = keyValueMap.find(key);
73 if (it == keyValueMap.end()) {
126 if (value ==
"TRUE" || value ==
"T" || value ==
"1") {
136 std::vector<double> defaultValue)
139 if (parseString ==
"") {
144 std::vector<double> values;
148 TIter nextToken(tokenStrings);
150 for (; tokenString != NULL; tokenString = (
TObjString *)nextToken()) {
151 std::stringstream sstr;
154 sstr >> currentValue;
155 values.push_back(currentValue);
172 " or cross entropy (binary classification).");
188 "Specify as 0.2 or 20% to use a fifth of the data set as validation set. "
189 "Specify as 100 to use exactly 100 events. (Default: 20%)");
202 "ConvergenceSteps=50,"
206 "Regularization=None,"
213 "ConvergenceSteps=50,"
219 "DropConfig=0.0+0.5+0.5,"
221 "Multithreading=True",
222 "TrainingStrategy",
"Defines the training strategies.");
230 Log() << kINFO <<
"Will ignore negative events in training!" <<
Endl;
234 Log() << kINFO <<
"The STANDARD architecture has been deprecated. "
235 "Please use Architecture=CPU or Architecture=CPU."
236 "See the TMVA Users' Guide for instructions if you "
237 "encounter problems."
241 Log() << kERROR <<
"The OPENCL architecture has not been implemented yet. "
242 "Please use Architecture=CPU or Architecture=CPU for the "
243 "time being. See the TMVA Users' Guide for instructions "
244 "if you encounter problems."
252#ifndef R__HAS_TMVAGPU
253 Log() << kERROR <<
"CUDA backend not enabled. Please make sure "
254 "you have CUDA installed and it was successfully "
255 "detected by CMAKE by using -Dtmva-gpu=On "
259 Log() << kINFO <<
"Will now use the CPU architecture !" <<
Endl;
262 Log() << kINFO <<
"Will now use the Standard architecture !" <<
Endl;
265 Log() << kINFO <<
"Will now use the GPU architecture !" <<
Endl;
269#ifndef R__HAS_TMVAGPU
270 Log() << kERROR <<
"CUDA+CUDNN backend not enabled. Please make sure "
271 "you have CUDNN and CUDA installed and that the GPU capability/CUDA "
272 "was successfully detected by CMAKE by using -Dtmva-gpu=On"
276 Log() << kINFO <<
"Will now use the CPU architecture !" <<
Endl;
279 Log() << kINFO <<
"Will now use the Standard architecture !" <<
Endl;
282 Log() << kINFO <<
"Will now use the GPU architecture !" <<
Endl;
287#ifndef R__HAS_TMVACPU
288 Log() << kERROR <<
"Multi-core CPU backend not enabled. Please make sure "
289 "you have a BLAS implementation and it was successfully "
290 "detected by CMake as well that the imt CMake flag is set."
294 Log() << kINFO <<
"Will now use the GPU architecture !" <<
Endl;
297 Log() << kINFO <<
"Will now use the Standard architecture !" <<
Endl;
300 Log() << kINFO <<
"Will now use the CPU architecture !" <<
Endl;
305 Log() << kINFO <<
"Will use the deprecated STANDARD architecture !" <<
Endl;
325 Log() << kWARNING <<
"For regression only SUMOFSQUARES is a valid "
326 <<
" neural net error function. Setting error function to "
327 <<
" SUMOFSQUARES now." <<
Endl;
366 for (
auto &
block : strategyKeyValues) {
389 if (optimizer ==
"SGD") {
391 }
else if (optimizer ==
"ADAM") {
393 }
else if (optimizer ==
"ADAGRAD") {
395 }
else if (optimizer ==
"RMSPROP") {
397 }
else if (optimizer ==
"ADADELTA") {
465 TIter nextInputDim(inputDimStrings);
471 std::vector<size_t> inputShape;
472 inputShape.reserve(inputLayoutString.
Length()/2 + 2);
473 inputShape.push_back(30);
474 for (; inputDimString !=
nullptr; inputDimString = (
TObjString *)nextInputDim()) {
479 inputShape.push_back(subDim);
495 size_t batchDepth = 0;
496 size_t batchHeight = 0;
497 size_t batchWidth = 0;
501 TIter nextBatchDim(batchDimStrings);
505 for (; batchDimString !=
nullptr; batchDimString = (
TObjString *)nextBatchDim()) {
510 batchDepth = (size_t)strDepth.
Atoi();
515 batchHeight = (size_t)strHeight.
Atoi();
520 batchWidth = (size_t)strWidth.
Atoi();
533template <
typename Architecture_t,
typename Layer_t>
538 const TString layerDelimiter(
",");
539 const TString subDelimiter(
"|");
547 TIter nextLayer(layerStrings);
551 for (; layerString !=
nullptr; layerString = (
TObjString *)nextLayer()) {
555 TIter nextToken(subStrings);
562 if (strLayerType ==
"DENSE") {
564 }
else if (strLayerType ==
"CONV") {
566 }
else if (strLayerType ==
"MAXPOOL") {
568 }
else if (strLayerType ==
"RESHAPE") {
570 }
else if (strLayerType ==
"BNORM") {
572 }
else if (strLayerType ==
"RNN") {
587template <
typename Architecture_t,
typename Layer_t>
598 const size_t inputSize =
GetNvar();
602 TIter nextToken(subStrings);
609 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
614 if (strActFnc ==
"DENSE")
continue;
616 if (strActFnc ==
"RELU") {
618 }
else if (strActFnc ==
"TANH") {
620 }
else if (strActFnc ==
"SYMMRELU") {
622 }
else if (strActFnc ==
"SOFTSIGN") {
624 }
else if (strActFnc ==
"SIGMOID") {
626 }
else if (strActFnc ==
"LINEAR") {
628 }
else if (strActFnc ==
"GAUSS") {
630 }
else if (
width == 0) {
634 TString strNumNodes = strActFnc;
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;
942 TIter nextToken(subStrings);
946 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
951 stateSize = strstateSize.
Atoi();
956 inputSize = strinputSize.
Atoi();
961 timeSteps = strtimeSteps.
Atoi();
966 rememberState = (bool) strrememberState.
Atoi();
974 timeSteps, rememberState);
978 if (
fBuildNet)
fNet->AddBasicRNNLayer(stateSize, inputSize, timeSteps, rememberState);
990template <
typename Architecture_t,
typename Layer_t>
997 TIter nextToken(subStrings);
1001 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
1011 :
MethodBase(jobName,
Types::kDL, methodTitle, theData, theOption), fInputShape(4,0),
1012 fBatchHeight(), fBatchWidth(), fRandomSeed(0), fWeightInitialization(),
1013 fOutputFunction(), fLossFunction(), fInputLayoutString(), fBatchLayoutString(),
1014 fLayoutString(), fErrorStrategy(), fTrainingStrategyString(), fWeightInitializationString(),
1015 fArchitectureString(), fResume(false), fBuildNet(true), fTrainingSettings(),
1024 :
MethodBase(
Types::kDL, theData, theWeightFile), fInputShape(4,0), fBatchHeight(),
1025 fBatchWidth(), fRandomSeed(0), fWeightInitialization(), fOutputFunction(),
1026 fLossFunction(), fInputLayoutString(), fBatchLayoutString(), fLayoutString(),
1027 fErrorStrategy(), fTrainingStrategyString(), fWeightInitializationString(),
1028 fArchitectureString(), fResume(false), fBuildNet(true), fTrainingSettings(),
1046 parseString.ReplaceAll(
" ",
"");
1048 const TString keyValueDelim(
"=");
1050 TObjArray *blockStrings = parseString.Tokenize(blockDelim);
1051 TIter nextBlock(blockStrings);
1054 for (; blockString !=
nullptr; blockString = (
TObjString *)nextBlock()) {
1055 blockKeyValues.push_back(std::map<TString, TString>());
1056 std::map<TString, TString> ¤tBlock = blockKeyValues.back();
1059 TIter nextToken(subStrings);
1062 for (; token !=
nullptr; token = (
TObjString *)nextToken()) {
1064 int delimPos = strKeyValue.
First(keyValueDelim.
Data());
1065 if (delimPos <= 0)
continue;
1074 currentBlock.insert(std::make_pair(strKey, strValue));
1077 return blockKeyValues;
1101 Int_t nValidationSamples = 0;
1106 if (fNumValidationString.EndsWith(
"%")) {
1111 Double_t valSizeAsDouble = fNumValidationString.Atof() / 100.0;
1112 nValidationSamples = GetEventCollection(
Types::kTraining).size() * valSizeAsDouble;
1114 Log() << kFATAL <<
"Cannot parse number \"" << fNumValidationString
1115 <<
"\". Expected string like \"20%\" or \"20.0%\"." <<
Endl;
1117 }
else if (fNumValidationString.IsFloat()) {
1118 Double_t valSizeAsDouble = fNumValidationString.Atof();
1120 if (valSizeAsDouble < 1.0) {
1122 nValidationSamples = GetEventCollection(
Types::kTraining).size() * valSizeAsDouble;
1125 nValidationSamples = valSizeAsDouble;
1128 Log() << kFATAL <<
"Cannot parse number \"" << fNumValidationString <<
"\". Expected string like \"0.2\" or \"100\"."
1134 if (nValidationSamples < 0) {
1135 Log() << kFATAL <<
"Validation size \"" << fNumValidationString <<
"\" is negative." <<
Endl;
1138 if (nValidationSamples == 0) {
1139 Log() << kFATAL <<
"Validation size \"" << fNumValidationString <<
"\" is zero." <<
Endl;
1142 if (nValidationSamples >= (
Int_t)trainingSetSize) {
1143 Log() << kFATAL <<
"Validation size \"" << fNumValidationString
1144 <<
"\" is larger than or equal in size to training set (size=\"" << trainingSetSize <<
"\")." <<
Endl;
1147 return nValidationSamples;
1154template <
typename Architecture_t>
1158 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
1400 std::string separator(62,
'-');
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 while (!converged) {
1430 optimizer->IncrementGlobalStep();
1431 trainingData.Shuffle(rng);
1437 for (
size_t i = 0; i < batchesInEpoch; ++i ) {
1444 if (debugFirstEpoch) std::cout <<
"\n\n----- batch # " << i <<
"\n\n";
1446 auto my_batch = trainingData.GetTensorBatch();
1448 if (debugFirstEpoch)
1449 std::cout <<
"got batch data - doing forward \n";
1453 Architecture_t::PrintTensor(my_batch.GetInput(),
"input tensor",
true);
1454 typename Architecture_t::Tensor_t tOut(my_batch.GetOutput());
1455 typename Architecture_t::Tensor_t tW(my_batch.GetWeights());
1456 Architecture_t::PrintTensor(tOut,
"label tensor",
true) ;
1457 Architecture_t::PrintTensor(tW,
"weight tensor",
true) ;
1460 deepNet.Forward(my_batch.GetInput(),
true);
1462 if (computeLossInTraining) {
1463 auto outputMatrix = my_batch.GetOutput();
1464 auto weights = my_batch.GetWeights();
1465 trainingError += deepNet.Loss(outputMatrix, weights,
false);
1468 if (debugFirstEpoch)
1469 std::cout <<
"- doing backward \n";
1472 size_t nlayers = deepNet.GetLayers().size();
1473 for (
size_t l = 0;
l < nlayers; ++
l) {
1474 if (deepNet.GetLayerAt(
l)->GetWeights().size() > 0)
1475 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetWeightsAt(0),
1478 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetOutput(),
1485 deepNet.Backward(my_batch.GetInput(), my_batch.GetOutput(), my_batch.GetWeights());
1487 if (debugFirstEpoch)
1488 std::cout <<
"- doing optimizer update \n";
1493 std::cout <<
"minmimizer step - momentum " << settings.momentum <<
" learning rate " << optimizer->GetLearningRate() << std::endl;
1494 for (
size_t l = 0;
l < nlayers; ++
l) {
1495 if (deepNet.GetLayerAt(
l)->GetWeights().size() > 0) {
1496 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetWeightsAt(0),
TString::Format(
"weights after step layer %d",
l).
Data());
1497 Architecture_t::PrintTensor(deepNet.GetLayerAt(
l)->GetWeightGradientsAt(0),
"weight gradients");
1504 if (debugFirstEpoch) std::cout <<
"\n End batch loop - compute validation loss \n";
1506 debugFirstEpoch =
false;
1507 if ((optimizer->GetGlobalStep() % settings.testInterval) == 0) {
1509 std::chrono::time_point<std::chrono::system_clock>
t1,t2;
1511 t1 = std::chrono::system_clock::now();
1517 bool inTraining =
false;
1518 for (
auto batch : validationData) {
1519 auto inputTensor = batch.GetInput();
1520 auto outputMatrix = batch.GetOutput();
1521 auto weights = batch.GetWeights();
1523 valError += deepNet.Loss(inputTensor, outputMatrix, weights, inTraining, includeRegularization);
1526 Double_t regTerm = (includeRegularization) ? deepNet.RegularizationTerm() : 0.0;
1527 valError /= (
Double_t)(nValidationSamples / settings.batchSize);
1528 valError += regTerm;
1533 t2 = std::chrono::system_clock::now();
1536 if (valError < minValError) {
1537 convergenceCount = 0;
1539 convergenceCount += settings.testInterval;
1543 if (valError < minValError ) {
1545 Log() << std::setw(10) << optimizer->GetGlobalStep()
1546 <<
" Minimum Test error found - save the configuration " <<
Endl;
1547 for (
size_t i = 0; i < deepNet.GetDepth(); ++i) {
1548 fNet->GetLayerAt(i)->CopyParameters(*deepNet.GetLayerAt(i));
1557 minValError = valError;
1559 else if ( minValError <= 0. )
1560 minValError = valError;
1562 if (!computeLossInTraining) {
1563 trainingError = 0.0;
1565 for (
auto batch : trainingData) {
1566 auto inputTensor = batch.GetInput();
1567 auto outputMatrix = batch.GetOutput();
1568 auto weights = batch.GetWeights();
1569 trainingError += deepNet.Loss(inputTensor, outputMatrix, weights,
false,
false);
1573 trainingError /= (
Double_t)(nTrainingSamples / settings.batchSize);
1574 trainingError += regTerm;
1580 tend = std::chrono::system_clock::now();
1583 std::chrono::duration<double> elapsed_seconds = tend - tstart;
1584 std::chrono::duration<double> elapsed1 =
t1-tstart;
1587 std::chrono::duration<double> elapsed_testing = tend-
t1;
1589 double seconds = elapsed_seconds.count();
1592 double eventTime = elapsed1.count()/( batchesInEpoch * settings.testInterval * settings.batchSize);
1595 convergenceCount > settings.convergenceSteps || optimizer->GetGlobalStep() >= settings.maxEpochs;
1598 Log() << std::setw(10) << optimizer->GetGlobalStep() <<
" | "
1599 << std::setw(12) << trainingError
1600 << std::setw(12) << valError
1601 << std::setw(12) << seconds / settings.testInterval
1602 << std::setw(12) << elapsed_testing.count()
1603 << std::setw(12) << 1. / eventTime
1604 << std::setw(12) << convergenceCount
1610 tstart = std::chrono::system_clock::now();
1614 if (converged && debug) {
1615 Log() <<
"Final Deep Net Weights for phase " << trainingPhase <<
" epoch " << optimizer->GetGlobalStep()
1617 auto & weights_tensor = deepNet.GetLayerAt(0)->GetWeights();
1618 auto & bias_tensor = deepNet.GetLayerAt(0)->GetBiases();
1619 for (
size_t l = 0;
l < weights_tensor.size(); ++
l)
1620 weights_tensor[
l].
Print();
1621 bias_tensor[0].Print();
1634 Log() << kFATAL <<
"Not implemented yet" <<
Endl;
1640#ifdef R__HAS_TMVAGPU
1641 Log() << kINFO <<
"Start of deep neural network training on GPU." <<
Endl <<
Endl;
1643 TrainDeepNet<DNN::TCudnn<ScalarImpl_t> >();
1645 TrainDeepNet<DNN::TCuda<ScalarImpl_t>>();
1648 Log() << kFATAL <<
"CUDA backend not enabled. Please make sure "
1649 "you have CUDA installed and it was successfully "
1650 "detected by CMAKE."
1655 Log() << kFATAL <<
"OPENCL backend not yet supported." <<
Endl;
1658#ifdef R__HAS_TMVACPU
1661 Log() << kINFO <<
"Start of deep neural network training on CPU using (for ROOT-IMT) nthreads = "
1663 TrainDeepNet<DNN::TCpu<ScalarImpl_t> >();
1665 Log() << kFATAL <<
"Multi-core CPU backend not enabled. Please make sure "
1666 "you have a BLAS implementation and it was successfully "
1667 "detected by CMake as well that the imt CMake flag is set."
1672 Log() << kINFO <<
"Start of deep neural network training on the STANDARD architecture" <<
Endl <<
Endl;
1674 TrainDeepNet<DNN::TReference<ScalarImpl_t> >();
1679 " is not a supported archiectire for TMVA::MethodDL"
1702 if (!
fNet ||
fNet->GetDepth() == 0) {
1703 Log() << kFATAL <<
"The network has not been trained and fNet is not built"
1725 if (
fXInput.GetShape().size() == 2) {
1729 Log() << kFATAL <<
"First tensor dimension should be equal to batch size, i.e. = 1"
1737 if ( nVariables != nc * nhw) {
1738 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1739 <<
" n-event variables " << nVariables <<
" expected input tensor " << nc <<
" x " << nhw
1742 for (
size_t j = 0; j < nc; j++) {
1743 for (
size_t k = 0; k < nhw; k++) {
1750 assert(
fXInput.GetShape().size() >= 4);
1751 size_t nc =
fXInput.GetCSize();
1752 size_t nh =
fXInput.GetHSize();
1753 size_t nw =
fXInput.GetWSize();
1754 size_t n = nc * nh * nw;
1755 if ( nVariables !=
n) {
1756 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1757 <<
" n-event variables " << nVariables <<
" expected input tensor " << nc <<
" x " << nh <<
" x " << nw
1760 for (
size_t j = 0; j <
n; j++) {
1772 double mvaValue = (*fYHat)(0, 0);
1775#ifdef DEBUG_MVAVALUE
1776 using Tensor_t = std::vector<MatrixImpl_t>;
1777 TMatrixF xInput(n1,n2, inputValues.data() );
1780 std::cout <<
"Output of DeepNet " << mvaValue << std::endl;
1781 auto & deepnet = *
fNet;
1782 std::cout <<
"Loop on layers " << std::endl;
1783 for (
int l = 0;
l < deepnet.GetDepth(); ++
l) {
1784 std::cout <<
"Layer " <<
l;
1785 const auto * layer = deepnet.GetLayerAt(
l);
1786 const Tensor_t & layer_output = layer->GetOutput();
1788 std::cout <<
"DNN output " << layer_output.size() << std::endl;
1789 for (
size_t i = 0; i < layer_output.size(); ++i) {
1790#ifdef R__HAS_TMVAGPU
1794 TMatrixD m(layer_output[i].GetNrows(), layer_output[i].GetNcols() , layer_output[i].GetRawDataPointer() );
1798 const Tensor_t & layer_weights = layer->GetWeights();
1799 std::cout <<
"DNN weights " << layer_weights.size() << std::endl;
1800 if (layer_weights.size() > 0) {
1802#ifdef R__HAS_TMVAGPU
1806 TMatrixD m(layer_weights[i].GetNrows(), layer_weights[i].GetNcols() , layer_weights[i].GetRawDataPointer() );
1818template <
typename Architecture_t>
1823 if (!
fNet ||
fNet->GetDepth() == 0) {
1824 Log() << kFATAL <<
"The network has not been trained and fNet is not built"
1842 using Matrix_t =
typename Architecture_t::Matrix_t;
1846 DeepNet_t deepNet(batchSize, inputDepth, inputHeight, inputWidth, batchDepth, batchHeight, batchWidth, J,
I,
R,
weightDecay);
1847 std::vector<DeepNet_t> nets{};
1852 for (
size_t i = 0; i < deepNet.GetDepth(); ++i) {
1853 deepNet.GetLayerAt(i)->CopyParameters(*
fNet->GetLayerAt(i));
1860 size_t n1 = deepNet.GetBatchHeight();
1861 size_t n2 = deepNet.GetBatchWidth();
1862 size_t n0 = deepNet.GetBatchSize();
1865 n1 = deepNet.GetBatchSize();
1869 Long64_t nEvents = lastEvt - firstEvt;
1871 TensorDataLoader_t testData(testTuple, nEvents, batchSize, {inputDepth, inputHeight, inputWidth}, {n0, n1, n2}, deepNet.GetOutputWidth(), 1);
1879 Matrix_t yHat(deepNet.GetBatchSize(), deepNet.GetOutputWidth() );
1888 <<
" sample (" << nEvents <<
" events)" <<
Endl;
1892 std::vector<double> mvaValues(nEvents);
1895 for (
Long64_t ievt = firstEvt; ievt < lastEvt; ievt+=batchSize) {
1897 Long64_t ievt_end = ievt + batchSize;
1899 if (ievt_end <= lastEvt) {
1901 if (ievt == firstEvt) {
1905 if (n1 == batchSize && n0 == 1) {
1906 if (n2 != nVariables) {
1907 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1908 <<
" n-event variables " << nVariables <<
" expected input matrix " << n1 <<
" x " << n2
1912 if (n1*n2 != nVariables || n0 != batchSize) {
1913 Log() << kFATAL <<
"Input Event variable dimensions are not compatible with the built network architecture"
1914 <<
" n-event variables " << nVariables <<
" expected input tensor " << n0 <<
" x " << n1 <<
" x " << n2
1920 auto batch = testData.GetTensorBatch();
1921 auto inputTensor = batch.GetInput();
1923 auto xInput = batch.GetInput();
1926 for (
size_t i = 0; i < batchSize; ++i) {
1927 double value = yHat(i,0);
1928 mvaValues[ievt + i] = (
TMath::IsNaN(value)) ? -999. : value;
1933 for (
Long64_t i = ievt; i < lastEvt; ++i) {
1942 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
1951 size_t nVariables = GetEvent()->GetNVariables();
1954 const Event *ev = GetEvent();
1955 const std::vector<Float_t>& inputValues = ev->
GetValues();
1956 for (
size_t i = 0; i < nVariables; i++) {
1957 X_vec(0,i,0) = inputValues[i];
1961 size_t nTargets = std::max(1u, ev->
GetNTargets());
1963 std::vector<Float_t>
output(nTargets);
1964 fNet->Prediction(YHat, X_vec, fOutputFunction);
1966 for (
size_t i = 0; i < nTargets; i++)
1969 if (fRegressionReturnVal == NULL) {
1970 fRegressionReturnVal =
new std::vector<Float_t>();
1972 fRegressionReturnVal->clear();
1975 for (
size_t i = 0; i < nTargets; ++i) {
1979 const Event* evT2 = GetTransformationHandler().InverseTransform(evT);
1980 for (
size_t i = 0; i < nTargets; ++i) {
1981 fRegressionReturnVal->push_back(evT2->
GetTarget(i));
1984 return *fRegressionReturnVal;
1989 size_t nVariables = GetEvent()->GetNVariables();
1993 if (fMulticlassReturnVal == NULL) {
1994 fMulticlassReturnVal =
new std::vector<Float_t>(DataInfo().GetNClasses());
1997 const std::vector<Float_t>& inputValues = GetEvent()->GetValues();
1998 for (
size_t i = 0; i < nVariables; i++) {
1999 X_vec(0,i, 0) = inputValues[i];
2002 fNet->Prediction(YHat, X_vec, fOutputFunction);
2003 for (
size_t i = 0; i < (size_t) YHat.GetNcols(); i++) {
2004 (*fMulticlassReturnVal)[i] = YHat(0, i);
2006 return *fMulticlassReturnVal;
2025 if (firstEvt > lastEvt || lastEvt > nEvents) lastEvt = nEvents;
2026 if (firstEvt < 0) firstEvt = 0;
2027 nEvents = lastEvt-firstEvt;
2030 size_t defaultEvalBatchSize = (
fXInput.GetSize() > 1000) ? 100 : 1000;
2032 if (
size_t(nEvents) < batchSize ) batchSize = nEvents;
2036#ifdef R__HAS_TMVAGPU
2037 Log() << kINFO <<
"Evaluate deep neural network on GPU using batches with size = " << batchSize <<
Endl <<
Endl;
2039 return PredictDeepNet<DNN::TCudnn<ScalarImpl_t>>(firstEvt, lastEvt, batchSize, logProgress);
2041 return PredictDeepNet<DNN::TCuda<ScalarImpl_t>>(firstEvt, lastEvt, batchSize, logProgress);
2047 Log() << kINFO <<
"Evaluate deep neural network on CPU using batches with size = " << batchSize <<
Endl <<
Endl;
2048 return PredictDeepNet<DNN::TCpu<ScalarImpl_t> >(firstEvt, lastEvt, batchSize, logProgress);
2051 Log() << kINFO <<
"ERROR: STANDARD architecture is not supported anymore for MethodDL ! "
2065 void* nn = xmlEngine.
NewChild(parent, 0,
"Weights");
2073 Int_t inputDepth =
fNet->GetInputDepth();
2074 Int_t inputHeight =
fNet->GetInputHeight();
2075 Int_t inputWidth =
fNet->GetInputWidth();
2079 Int_t batchDepth =
fNet->GetBatchDepth();
2080 Int_t batchHeight =
fNet->GetBatchHeight();
2081 Int_t batchWidth =
fNet->GetBatchWidth();
2083 char lossFunction =
static_cast<char>(
fNet->GetLossFunction());
2084 char initialization =
static_cast<char>(
fNet->GetInitialization());
2105 xmlEngine.NewAttr(nn, 0,
"LossFunction",
TString(lossFunction));
2106 xmlEngine.NewAttr(nn, 0,
"Initialization",
TString(initialization));
2108 xmlEngine.NewAttr(nn, 0,
"OutputFunction",
TString(outputFunction));
2113 for (
Int_t i = 0; i < depth; i++)
2133 size_t inputDepth, inputHeight, inputWidth;
2138 size_t batchSize, batchDepth, batchHeight, batchWidth;
2146 char lossFunctionChar;
2148 char initializationChar;
2150 char regularizationChar;
2152 char outputFunctionChar;
2169 fNet = std::unique_ptr<DeepNetImpl_t>(
new DeepNetImpl_t(batchSize, inputDepth, inputHeight, inputWidth, batchDepth,
2170 batchHeight, batchWidth,
2183 for (
size_t i = 0; i < netDepth; i++) {
2188 if (layerName ==
"DenseLayer") {
2204 else if (layerName ==
"ConvLayer") {
2209 size_t fltHeight, fltWidth = 0;
2210 size_t strideRows, strideCols = 0;
2211 size_t padHeight, padWidth = 0;
2225 fNet->AddConvLayer(depth, fltHeight, fltWidth, strideRows, strideCols,
2226 padHeight, padWidth, actFunction);
2231 else if (layerName ==
"MaxPoolLayer") {
2234 size_t filterHeight, filterWidth = 0;
2235 size_t strideRows, strideCols = 0;
2241 fNet->AddMaxPoolLayer(filterHeight, filterWidth, strideRows, strideCols);
2243 else if (layerName ==
"ReshapeLayer") {
2246 size_t depth, height,
width = 0;
2253 fNet->AddReshapeLayer(depth, height,
width, flattening);
2256 else if (layerName ==
"RNNLayer") {
2259 size_t stateSize,inputSize, timeSteps = 0;
2260 int rememberState= 0;
2266 fNet->AddBasicRNNLayer(stateSize, inputSize, timeSteps, rememberState);
2270 else if (layerName ==
"BatchNormLayer") {
2272 fNet->AddBatchNormLayer(0., 0.0);
2275 fNet->GetLayers().back()->ReadWeightsFromXML(layerXML);
#define REGISTER_METHOD(CLASS)
for example
#define R(a, b, c, d, e, f, g, h, i)
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.
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,...
TBasicRNNLayer< Architecture_t > * AddBasicRNNLayer(size_t stateSize, size_t inputSize, size_t timeSteps, bool rememberState=false, EActivationFunction f=EActivationFunction::kTanh)
Function for adding Recurrent 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.
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.
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.
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.
void ParseRnnLayer(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.
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 ParseLstmLayer(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 lstm layer.
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
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 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)
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754
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)