24 #ifndef TMVA_NEURAL_NET
25 #define TMVA_NEURAL_NET
41 #include <type_traits>
59 class IPythonInteractive;
68 double gaussDouble (
double mean,
double sigma);
69 double uniformDouble (
double minValue,
double maxValue);
70 int randomInt (
int maxValue);
94 inline void add(T value,
double weight = 1.0)
102 m_sumWeights = weight;
106 double tmpWeight = m_sumWeights+weight;
107 double Q = value - m_mean;
109 double R = Q*weight/tmpWeight;
111 m_squared += m_sumWeights*R*Q;
113 m_sumWeights = tmpWeight;
116 template <
typename ITERATOR>
117 inline void add (ITERATOR itBegin, ITERATOR itEnd)
119 for (ITERATOR it = itBegin; it != itEnd; ++it)
125 inline int count()
const {
return m_n; }
126 inline double weights()
const {
if(m_n==0)
return 0;
return m_sumWeights; }
127 inline double mean()
const {
if(m_n==0)
return 0;
return m_mean; }
128 inline double var()
const
134 return (m_squared/m_sumWeights);
137 inline double var_corr ()
const
142 return (var()*m_n/(m_n-1));
145 inline double stdDev_corr ()
const {
return sqrt( var_corr() ); }
146 inline double stdDev ()
const {
return sqrt( var() ); }
157 enum class EnumFunction
168 GAUSSCOMPLEMENT =
'C'
173 enum class EnumRegularization
179 enum class ModeOutputValues : int
184 BATCHNORMALIZATION = 0x08
189 inline ModeOutputValues operator| (ModeOutputValues lhs, ModeOutputValues rhs)
191 return (ModeOutputValues)(
static_cast<std::underlying_type<ModeOutputValues>::type
>(lhs) |
static_cast<std::underlying_type<ModeOutputValues>::type
>(rhs));
194 inline ModeOutputValues operator|= (ModeOutputValues& lhs, ModeOutputValues rhs)
196 lhs = (ModeOutputValues)(
static_cast<std::underlying_type<ModeOutputValues>::type
>(lhs) |
static_cast<std::underlying_type<ModeOutputValues>::type
>(rhs));
200 inline ModeOutputValues operator& (ModeOutputValues lhs, ModeOutputValues rhs)
202 return (ModeOutputValues)(
static_cast<std::underlying_type<ModeOutputValues>::type
>(lhs) &
static_cast<std::underlying_type<ModeOutputValues>::type
>(rhs));
205 inline ModeOutputValues operator&= (ModeOutputValues& lhs, ModeOutputValues rhs)
207 lhs = (ModeOutputValues)(
static_cast<std::underlying_type<ModeOutputValues>::type
>(lhs) &
static_cast<std::underlying_type<ModeOutputValues>::type
>(rhs));
212 template <
typename T>
213 bool isFlagSet (T flag, T value)
215 return (
int)(value & flag) != 0;
228 typedef std::vector<char> DropContainer;
238 typedef typename std::vector<Pattern>::const_iterator const_iterator;
240 Batch (
typename std::vector<Pattern>::const_iterator itBegin,
typename std::vector<Pattern>::const_iterator itEnd)
241 : m_itBegin (itBegin)
245 const_iterator begin ()
const {
return m_itBegin; }
246 const_iterator end ()
const {
return m_itEnd; }
248 size_t size ()
const {
return std::distance (begin (), end ()); }
251 const_iterator m_itBegin;
252 const_iterator m_itEnd;
260 template <
typename ItSource,
typename ItWeight,
typename ItTarget>
261 void applyWeights (ItSource itSourceBegin, ItSource itSourceEnd, ItWeight itWeight, ItTarget itTargetBegin, ItTarget itTargetEnd);
265 template <
typename ItSource,
typename ItWeight,
typename ItPrev>
266 void applyWeightsBackwards (ItSource itCurrBegin, ItSource itCurrEnd, ItWeight itWeight, ItPrev itPrevBegin, ItPrev itPrevEnd);
272 template <
typename ItValue,
typename ItFunction>
273 void applyFunctions (ItValue itValue, ItValue itValueEnd, ItFunction itFunction);
276 template <
typename ItValue,
typename ItFunction,
typename ItInverseFunction,
typename ItGradient>
277 void applyFunctions (ItValue itValue, ItValue itValueEnd, ItFunction itFunction, ItInverseFunction itInverseFunction, ItGradient itGradient);
281 template <
typename ItSource,
typename ItDelta,
typename ItTargetGradient,
typename ItGradient>
282 void update (ItSource itSource, ItSource itSourceEnd,
283 ItDelta itTargetDeltaBegin, ItDelta itTargetDeltaEnd,
284 ItTargetGradient itTargetGradientBegin,
285 ItGradient itGradient);
289 template <EnumRegularization Regularization,
typename ItSource,
typename ItDelta,
typename ItTargetGradient,
typename ItGradient,
typename ItWeight>
290 void update (ItSource itSource, ItSource itSourceEnd,
291 ItDelta itTargetDeltaBegin, ItDelta itTargetDeltaEnd,
292 ItTargetGradient itTargetGradientBegin,
293 ItGradient itGradient,
294 ItWeight itWeight,
double weightDecay);
338 size_t m_repetitions;
349 Steepest (
double learningRate = 1e-4,
350 double momentum = 0.5,
351 size_t repetitions = 10)
352 : m_repetitions (repetitions)
353 , m_alpha (learningRate)
368 template <
typename Function,
typename Weights,
typename PassThrough>
369 double operator() (Function& fitnessFunction, Weights& weights, PassThrough& passThrough);
374 std::vector<double> m_prevGradients;
376 std::vector<double> m_localWeights;
377 std::vector<double> m_localGradients;
397 template <
typename ItOutput,
typename ItTruth,
typename ItDelta,
typename ItInvActFnc>
398 double sumOfSquares (ItOutput itOutputBegin, ItOutput itOutputEnd, ItTruth itTruthBegin, ItTruth itTruthEnd, ItDelta itDelta, ItDelta itDeltaEnd, ItInvActFnc itInvActFnc,
double patternWeight);
402 template <
typename ItProbability,
typename ItTruth,
typename ItDelta,
typename ItInvActFnc>
403 double crossEntropy (ItProbability itProbabilityBegin, ItProbability itProbabilityEnd, ItTruth itTruthBegin, ItTruth itTruthEnd, ItDelta itDelta, ItDelta itDeltaEnd, ItInvActFnc itInvActFnc,
double patternWeight);
408 template <
typename ItOutput,
typename ItTruth,
typename ItDelta,
typename ItInvActFnc>
409 double softMaxCrossEntropy (ItOutput itProbabilityBegin, ItOutput itProbabilityEnd, ItTruth itTruthBegin, ItTruth itTruthEnd, ItDelta itDelta, ItDelta itDeltaEnd, ItInvActFnc itInvActFnc,
double patternWeight);
415 template <
typename ItWeight>
416 double weightDecay (
double error, ItWeight itWeight, ItWeight itWeightEnd,
double factorWeightDecay, EnumRegularization eRegularization);
440 typedef std::vector<double> container_type;
442 typedef container_type::iterator iterator_type;
443 typedef container_type::const_iterator const_iterator_type;
445 typedef std::vector<std::function<double(double)> > function_container_type;
446 typedef function_container_type::iterator function_iterator_type;
447 typedef function_container_type::const_iterator const_function_iterator_type;
449 typedef DropContainer::const_iterator const_dropout_iterator;
462 LayerData (const_iterator_type itInputBegin, const_iterator_type itInputEnd, ModeOutputValues eModeOutput = ModeOutputValues::DIRECT);
471 LayerData (
size_t inputSize);
491 LayerData (
size_t size,
492 const_iterator_type itWeightBegin,
493 iterator_type itGradientBegin,
494 std::shared_ptr<std::function<
double(
double)>> activationFunction,
495 std::shared_ptr<std::function<
double(
double)>> inverseActivationFunction,
496 ModeOutputValues eModeOutput = ModeOutputValues::DIRECT);
511 LayerData (
size_t size, const_iterator_type itWeightBegin,
512 std::shared_ptr<std::function<
double(
double)>> activationFunction,
513 ModeOutputValues eModeOutput = ModeOutputValues::DIRECT);
519 LayerData (
const LayerData& other)
520 : m_size (other.m_size)
521 , m_itInputBegin (other.m_itInputBegin)
522 , m_itInputEnd (other.m_itInputEnd)
523 , m_deltas (other.m_deltas)
524 , m_valueGradients (other.m_valueGradients)
525 , m_values (other.m_values)
526 , m_itDropOut (other.m_itDropOut)
527 , m_hasDropOut (other.m_hasDropOut)
528 , m_itConstWeightBegin (other.m_itConstWeightBegin)
529 , m_itGradientBegin (other.m_itGradientBegin)
530 , m_activationFunction (other.m_activationFunction)
531 , m_inverseActivationFunction (other.m_inverseActivationFunction)
532 , m_isInputLayer (other.m_isInputLayer)
533 , m_hasWeights (other.m_hasWeights)
534 , m_hasGradients (other.m_hasGradients)
535 , m_eModeOutput (other.m_eModeOutput)
542 LayerData (LayerData&& other)
543 : m_size (other.m_size)
544 , m_itInputBegin (other.m_itInputBegin)
545 , m_itInputEnd (other.m_itInputEnd)
546 , m_deltas (std::move(other.m_deltas))
547 , m_valueGradients (std::move(other.m_valueGradients))
548 , m_values (std::move(other.m_values))
549 , m_itDropOut (other.m_itDropOut)
550 , m_hasDropOut (other.m_hasDropOut)
551 , m_itConstWeightBegin (other.m_itConstWeightBegin)
552 , m_itGradientBegin (other.m_itGradientBegin)
553 , m_activationFunction (std::move(other.m_activationFunction))
554 , m_inverseActivationFunction (std::move(other.m_inverseActivationFunction))
555 , m_isInputLayer (other.m_isInputLayer)
556 , m_hasWeights (other.m_hasWeights)
557 , m_hasGradients (other.m_hasGradients)
558 , m_eModeOutput (other.m_eModeOutput)
569 void setInput (const_iterator_type itInputBegin, const_iterator_type itInputEnd)
571 m_isInputLayer =
true;
572 m_itInputBegin = itInputBegin;
573 m_itInputEnd = itInputEnd;
582 m_values.assign (m_values.size (), 0.0);
583 m_deltas.assign (m_deltas.size (), 0.0);
586 const_iterator_type valuesBegin ()
const {
return m_isInputLayer ? m_itInputBegin : begin (m_values); }
587 const_iterator_type valuesEnd ()
const {
return m_isInputLayer ? m_itInputEnd : end (m_values); }
589 iterator_type valuesBegin () { assert (!m_isInputLayer);
return begin (m_values); }
590 iterator_type valuesEnd () { assert (!m_isInputLayer);
return end (m_values); }
592 ModeOutputValues outputMode ()
const {
return m_eModeOutput; }
593 container_type probabilities ()
const {
return computeProbabilities (); }
595 iterator_type deltasBegin () {
return begin (m_deltas); }
596 iterator_type deltasEnd () {
return end (m_deltas); }
598 const_iterator_type deltasBegin ()
const {
return begin (m_deltas); }
599 const_iterator_type deltasEnd ()
const {
return end (m_deltas); }
601 iterator_type valueGradientsBegin () {
return begin (m_valueGradients); }
602 iterator_type valueGradientsEnd () {
return end (m_valueGradients); }
604 const_iterator_type valueGradientsBegin ()
const {
return begin (m_valueGradients); }
605 const_iterator_type valueGradientsEnd ()
const {
return end (m_valueGradients); }
607 iterator_type gradientsBegin () { assert (m_hasGradients);
return m_itGradientBegin; }
608 const_iterator_type gradientsBegin ()
const { assert (m_hasGradients);
return m_itGradientBegin; }
609 const_iterator_type weightsBegin ()
const { assert (m_hasWeights);
return m_itConstWeightBegin; }
611 std::shared_ptr<std::function<double(double)>> activationFunction ()
const {
return m_activationFunction; }
612 std::shared_ptr<std::function<double(double)>> inverseActivationFunction ()
const {
return m_inverseActivationFunction; }
617 template <
typename Iterator>
618 void setDropOut (Iterator itDrop) { m_itDropOut = itDrop; m_hasDropOut =
true; }
624 void clearDropOut () { m_hasDropOut =
false; }
626 bool hasDropOut ()
const {
return m_hasDropOut; }
627 const_dropout_iterator dropOut ()
const { assert (m_hasDropOut);
return m_itDropOut; }
629 size_t size ()
const {
return m_size; }
637 container_type computeProbabilities ()
const;
643 const_iterator_type m_itInputBegin;
644 const_iterator_type m_itInputEnd;
646 std::vector<double> m_deltas;
647 std::vector<double> m_valueGradients;
648 std::vector<double> m_values;
649 const_dropout_iterator m_itDropOut;
652 const_iterator_type m_itConstWeightBegin;
653 iterator_type m_itGradientBegin;
655 std::shared_ptr<std::function<double(double)>> m_activationFunction;
656 std::shared_ptr<std::function<double(double)>> m_inverseActivationFunction;
662 ModeOutputValues m_eModeOutput;
687 Layer (
size_t numNodes, EnumFunction activationFunction, ModeOutputValues eModeOutputValues = ModeOutputValues::DIRECT);
689 ModeOutputValues modeOutputValues ()
const {
return m_eModeOutputValues; }
690 void modeOutputValues (ModeOutputValues eModeOutputValues) { m_eModeOutputValues = eModeOutputValues; }
692 size_t numNodes ()
const {
return m_numNodes; }
693 size_t numWeights (
size_t numInputNodes)
const {
return numInputNodes * numNodes (); }
695 std::shared_ptr<std::function<double(double)>> activationFunction ()
const {
return m_activationFunction; }
696 std::shared_ptr<std::function<double(double)>> inverseActivationFunction ()
const {
return m_inverseActivationFunction; }
698 EnumFunction activationFunctionType ()
const {
return m_activationFunctionType; }
703 std::shared_ptr<std::function<double(double)>> m_activationFunction;
704 std::shared_ptr<std::function<double(double)>> m_inverseActivationFunction;
709 ModeOutputValues m_eModeOutputValues;
710 EnumFunction m_activationFunctionType;
719 template <
typename LAYERDATA>
720 void forward (
const LAYERDATA& prevLayerData, LAYERDATA& currLayerData);
723 template <
typename LAYERDATA>
724 void backward (LAYERDATA& prevLayerData, LAYERDATA& currLayerData);
727 template <
typename LAYERDATA>
728 void update (
const LAYERDATA& prevLayerData, LAYERDATA& currLayerData,
double weightDecay, EnumRegularization regularization);
744 Settings (TString name,
745 size_t _convergenceSteps = 15,
size_t _batchSize = 10,
size_t _testRepetitions = 7,
746 double _factorWeightDecay = 1e-5, TMVA::DNN::EnumRegularization _regularization = TMVA::DNN::EnumRegularization::NONE,
747 MinimizerType _eMinimizerType = MinimizerType::fSteepest,
748 double _learningRate = 1e-5,
double _momentum = 0.3,
749 int _repetitions = 3,
750 bool _multithreading =
true);
756 virtual ~Settings ();
765 template <
typename Iterator>
766 void setDropOut (Iterator begin, Iterator end,
size_t _dropRepetitions) { m_dropOut.assign (begin, end); m_dropRepetitions = _dropRepetitions; }
768 size_t dropRepetitions ()
const {
return m_dropRepetitions; }
769 const std::vector<double>& dropFractions ()
const {
return m_dropOut; }
771 void setMonitoring (std::shared_ptr<Monitoring> ptrMonitoring) { fMonitoring = ptrMonitoring; }
773 size_t convergenceSteps ()
const {
return m_convergenceSteps; }
774 size_t batchSize ()
const {
return m_batchSize; }
775 size_t testRepetitions ()
const {
return m_testRepetitions; }
776 double factorWeightDecay ()
const {
return m_factorWeightDecay; }
778 double learningRate ()
const {
return fLearningRate; }
779 double momentum ()
const {
return fMomentum; }
780 int repetitions ()
const {
return fRepetitions; }
781 MinimizerType minimizerType ()
const {
return fMinimizerType; }
788 virtual void testSample (
double ,
double ,
double ,
double ) {}
789 virtual void startTrainCycle ()
791 m_convergenceCount = 0;
792 m_maxConvergenceCount= 0;
795 virtual void endTrainCycle (
double ) {}
797 virtual void setProgressLimits (
double minProgress = 0,
double maxProgress = 100)
799 m_minProgress = minProgress;
800 m_maxProgress = maxProgress;
802 virtual void startTraining ()
804 m_timer.DrawProgressBar (Int_t(m_minProgress));
806 virtual void cycle (
double progress, TString text)
808 m_timer.DrawProgressBar (Int_t(m_minProgress+(m_maxProgress-m_minProgress)*(progress/100.0)), text);
811 virtual void startTestCycle () {}
812 virtual void endTestCycle () {}
813 virtual void testIteration () {}
814 virtual void drawSample (
const std::vector<double>& ,
const std::vector<double>& ,
const std::vector<double>& ,
double ) {}
816 virtual void computeResult (
const Net& , std::vector<double>& ) {}
818 virtual bool hasConverged (
double testError);
820 EnumRegularization regularization ()
const {
return m_regularization; }
822 bool useMultithreading ()
const {
return m_useMultithreading; }
825 void pads (
int numPads) {
if (fMonitoring) fMonitoring->pads (numPads); }
826 void create (std::string histoName,
int bins,
double min,
double max) {
if (fMonitoring) fMonitoring->create (histoName, bins, min, max); }
827 void create (std::string histoName,
int bins,
double min,
double max,
int bins2,
double min2,
double max2) {
if (fMonitoring) fMonitoring->create (histoName, bins, min, max, bins2, min2, max2); }
828 void addPoint (std::string histoName,
double x) {
if (fMonitoring) fMonitoring->addPoint (histoName, x); }
829 void addPoint (std::string histoName,
double x,
double y) {
if (fMonitoring) fMonitoring->addPoint (histoName, x, y); }
830 void plot (std::string histoName, std::string options,
int pad, EColor color) {
if (fMonitoring) fMonitoring->plot (histoName, options, pad, color); }
831 void clear (std::string histoName) {
if (fMonitoring) fMonitoring->clear (histoName); }
832 bool exists (std::string histoName) {
if (fMonitoring)
return fMonitoring->exists (histoName);
return false; }
834 size_t convergenceCount ()
const {
return m_convergenceCount; }
835 size_t maxConvergenceCount ()
const {
return m_maxConvergenceCount; }
836 size_t minError ()
const {
return m_minError; }
840 double m_minProgress;
841 double m_maxProgress;
844 size_t m_convergenceSteps;
846 size_t m_testRepetitions;
847 double m_factorWeightDecay;
854 EnumRegularization m_regularization;
856 double m_dropRepetitions;
857 std::vector<double> m_dropOut;
859 double fLearningRate;
862 MinimizerType fMinimizerType;
864 size_t m_convergenceCount;
865 size_t m_maxConvergenceCount;
870 bool m_useMultithreading;
872 std::shared_ptr<Monitoring> fMonitoring;
901 class ClassificationSettings :
public Settings
908 ClassificationSettings (TString name,
909 size_t _convergenceSteps = 15,
size_t _batchSize = 10,
size_t _testRepetitions = 7,
910 double _factorWeightDecay = 1e-5, EnumRegularization _regularization = EnumRegularization::NONE,
911 size_t _scaleToNumEvents = 0, MinimizerType _eMinimizerType = MinimizerType::fSteepest,
912 double _learningRate = 1e-5,
double _momentum = 0.3,
int _repetitions = 3,
913 bool _useMultithreading =
true)
914 : Settings (name, _convergenceSteps, _batchSize, _testRepetitions, _factorWeightDecay,
915 _regularization, _eMinimizerType, _learningRate, _momentum, _repetitions, _useMultithreading)
917 , m_sumOfSigWeights (0)
918 , m_sumOfBkgWeights (0)
919 , m_scaleToNumEvents (_scaleToNumEvents)
921 , m_pResultPatternContainer (NULL)
922 , m_fileNameResult ()
923 , m_fileNameNetConfig ()
931 virtual ~ClassificationSettings ()
935 void startTrainCycle ();
936 void endTrainCycle (
double );
937 void testIteration () {
if (fMonitoring) fMonitoring->ProcessEvents (); }
993 void testSample (
double error,
double output,
double target,
double weight);
995 virtual void startTestCycle ();
996 virtual void endTestCycle ();
999 void setWeightSums (
double sumOfSigWeights,
double sumOfBkgWeights);
1000 void setResultComputation (std::string _fileNameNetConfig, std::string _fileNameResult, std::vector<Pattern>* _resultPatternContainer);
1002 std::vector<double> m_input;
1003 std::vector<double> m_output;
1004 std::vector<double> m_targets;
1005 std::vector<double> m_weights;
1007 std::vector<double> m_ams;
1008 std::vector<double> m_significances;
1011 double m_sumOfSigWeights;
1012 double m_sumOfBkgWeights;
1013 size_t m_scaleToNumEvents;
1016 std::vector<Pattern>* m_pResultPatternContainer;
1017 std::string m_fileNameResult;
1018 std::string m_fileNameNetConfig;
1036 enum class ModeOutput
1045 enum class ModeErrorFunction
1049 CROSSENTROPY_MUTUALEXCLUSIVE =
'M'
1056 enum class WeightInitializationStrategy
1058 XAVIER, TEST, LAYERSIZE, XAVIERUNIFORM
1072 typedef std::vector<double> container_type;
1073 typedef container_type::iterator iterator_type;
1074 typedef std::pair<iterator_type,iterator_type> begin_end_type;
1082 : m_eErrorFunction (ModeErrorFunction::SUMOFSQUARES)
1092 Net (
const Net& other)
1093 : m_eErrorFunction (other.m_eErrorFunction)
1094 , m_sizeInput (other.m_sizeInput)
1095 , m_layers (other.m_layers)
1099 void setInputSize (
size_t sizeInput) { m_sizeInput = sizeInput; }
1100 void setOutputSize (
size_t sizeOutput) { m_sizeOutput = sizeOutput; }
1101 void addLayer (Layer& layer) { m_layers.push_back (layer); }
1102 void addLayer (Layer&& layer) { m_layers.push_back (layer); }
1103 void setErrorFunction (ModeErrorFunction eErrorFunction) { m_eErrorFunction = eErrorFunction; }
1105 size_t inputSize ()
const {
return m_sizeInput; }
1106 size_t outputSize ()
const {
return m_sizeOutput; }
1112 template <
typename WeightsType,
typename DropProbabilities>
1113 void dropOutWeightFactor (WeightsType& weights,
1114 const DropProbabilities& drops,
1115 bool inverse =
false);
1125 template <
typename Minimizer>
1126 double train (std::vector<double>& weights,
1127 std::vector<Pattern>& trainPattern,
1128 const std::vector<Pattern>& testPattern,
1129 Minimizer& minimizer,
1130 Settings& settings);
1136 template <
typename Minimizer>
1137 void preTrain (std::vector<double>& weights,
1138 std::vector<Pattern>& trainPattern,
1139 const std::vector<Pattern>& testPattern,
1140 Minimizer& minimizer, Settings& settings);
1152 template <
typename Iterator,
typename Minimizer>
1153 inline double trainCycle (Minimizer& minimizer, std::vector<double>& weights,
1154 Iterator itPatternBegin, Iterator itPatternEnd,
1156 DropContainer& dropContainer);
1158 size_t numWeights (
size_t trainingStartLayer = 0)
const;
1159 size_t numNodes (
size_t trainingStartLayer = 0)
const;
1161 template <
typename Weights>
1162 std::vector<double> compute (
const std::vector<double>& input,
const Weights& weights)
const;
1164 template <
typename Weights,
typename PassThrough>
1165 double operator() (PassThrough& settingsAndBatch,
const Weights& weights)
const;
1167 template <
typename Weights,
typename PassThrough,
typename OutContainer>
1168 double operator() (PassThrough& settingsAndBatch,
const Weights& weights, ModeOutput eFetch, OutContainer& outputContainer)
const;
1170 template <
typename Weights,
typename Gradients,
typename PassThrough>
1171 double operator() (PassThrough& settingsAndBatch, Weights& weights, Gradients& gradients)
const;
1173 template <
typename Weights,
typename Gradients,
typename PassThrough,
typename OutContainer>
1174 double operator() (PassThrough& settingsAndBatch, Weights& weights, Gradients& gradients, ModeOutput eFetch, OutContainer& outputContainer)
const;
1177 template <
typename LayerContainer,
typename DropContainer,
typename ItWeight,
typename ItGradient>
1178 std::vector<std::vector<LayerData>> prepareLayerData (LayerContainer& layers,
1180 const DropContainer& dropContainer,
1181 ItWeight itWeightBegin,
1182 ItWeight itWeightEnd,
1183 ItGradient itGradientBegin,
1184 ItGradient itGradientEnd,
1185 size_t& totalNumWeights)
const;
1187 template <
typename LayerContainer>
1188 void forwardPattern (
const LayerContainer& _layers,
1189 std::vector<LayerData>& layerData)
const;
1192 template <
typename LayerContainer,
typename LayerPatternContainer>
1193 void forwardBatch (
const LayerContainer& _layers,
1194 LayerPatternContainer& layerPatternData,
1195 std::vector<double>& valuesMean,
1196 std::vector<double>& valuesStdDev,
1197 size_t trainFromLayer)
const;
1199 template <
typename OutputContainer>
1200 void fetchOutput (
const LayerData& lastLayerData, OutputContainer& outputContainer)
const;
1202 template <
typename OutputContainer>
1203 void fetchOutput (
const std::vector<LayerData>& layerPatternData, OutputContainer& outputContainer)
const;
1206 template <
typename ItWeight>
1207 std::tuple<double,
double> computeError (
const Settings& settings,
1208 std::vector<LayerData>& lastLayerData,
1210 ItWeight itWeightBegin,
1211 ItWeight itWeightEnd)
const;
1213 template <
typename Settings>
1214 void backPropagate (std::vector<std::vector<LayerData>>& layerPatternData,
1215 const Settings& settings,
1216 size_t trainFromLayer,
1217 size_t totalNumWeights)
const;
1225 template <
typename LayerContainer,
typename PassThrough,
typename ItWeight,
typename ItGradient,
typename OutContainer>
1226 double forward_backward (LayerContainer& layers, PassThrough& settingsAndBatch,
1227 ItWeight itWeightBegin, ItWeight itWeightEnd,
1228 ItGradient itGradientBegin, ItGradient itGradientEnd,
1229 size_t trainFromLayer,
1230 OutContainer& outputContainer,
bool fetchOutput)
const;
1242 template <
typename Container,
typename ItWeight>
1243 double errorFunction (LayerData& layerData,
1246 ItWeight itWeightEnd,
1247 double patternWeight,
1248 double factorWeightDecay,
1249 EnumRegularization eRegularization)
const;
1252 const std::vector<Layer>& layers ()
const {
return m_layers; }
1253 std::vector<Layer>& layers () {
return m_layers; }
1255 void removeLayer () { m_layers.pop_back (); }
1261 m_eErrorFunction = ModeErrorFunction::SUMOFSQUARES;
1265 template <
typename OutIterator>
1266 void initializeWeights (WeightInitializationStrategy eInitStrategy,
1267 OutIterator itWeight);
1271 void fillDropContainer (DropContainer& dropContainer,
double dropFraction,
size_t numNodes)
const;
1276 ModeErrorFunction m_eErrorFunction;
1278 size_t m_sizeOutput;
1279 std::vector<Layer> m_layers;
1283 IPythonInteractive *fInteractive =
nullptr;
1284 bool * fExitFromTraining =
nullptr;
1285 UInt_t *fIPyMaxIter =
nullptr, *fIPyCurrentIter =
nullptr;
1290 void SetIpythonInteractive(IPythonInteractive* fI,
bool* fE, UInt_t *M, UInt_t *C){
1292 fExitFromTraining = fE;
1294 fIPyCurrentIter = C;
1301 typedef std::tuple<Settings&, Batch&, DropContainer&> pass_through_type;