Conscience Core
CscNeuralNetwork.h
Go to the documentation of this file.
1 /*
2  * CscNeuralNetwork.h
3  *
4  * Created on: 24 novembre 2023
5  * Author: Max Lhermitte
6  */
7 
8 #ifndef CSCNEURALNETWORK_H_
9 #define CSCNEURALNETWORK_H_
10 
11 #include "CscCommon.h"
12 
13 #include <random>
14 
15 using std::mt19937;
16 
17 namespace conscience_core::ai::nn {
18 
19 // Do not modify the enum values! This could prevent saved neural networks from loading correctly
21 {
24 };
25 
26 // Do not modify the enum values! This could prevent saved neural networks from loading correctly
28 {
29  Linear = 0,
30  Sigmoid = 1, Tanh = 2,
31  Elu = 3, Relu = 4, Relu6, Selu, LeakyRelu,
34  Erf,
43 };
44 
45 // Do not modify the enum values! This could prevent saved neural networks from loading correctly
47 {
51 };
52 
55  He, // Used with Relu activation function or its variantes
56  GlorotUniform, // Ideal for linear or piecewise linear activation functions (e.g., ReLU and its variants in certain contexts)
57  GlorotNormal, // Ideal for symmetric activation functions and/or those whose output is centered around zero, like the hyperbolic tangent (tanh) or the sigmoid function.
58  LeCunNormal // Suggested for piecewise linear activation functions like the symmetric sigmoid activation function
59 };
60 
65 };
66 
70 };
71 
77 };
78 
80 public:
82  private:
83  const int nbInputs;
84  int nbHiddenLayers;
85  vector<int> nbNeuronsPerHiddenLayer;
86  const int nbOutputs;
87 
88  public:
89  NeuralNetworkShape(int nbInputsNN, int nbHiddenLayersNN, vector<int> nbNeuronsPerHiddenLayerNN, int nbOutputsNN);
90  NeuralNetworkShape(int nbInputsNN, int nbHiddenLayersNN, int nbNeuronsPerHiddenLayerNN, int nbOutputsNN);
91  const int getNbInputs() const;
92  const int getNbHiddenLayers() const;
93  vector<int> getNbNeuronsPerHiddenLayerVector() const;
94  const int getNbOutputs() const;
95  NeuralNetworkShape* getDuplicata();
96 
97  void setNbHiddenLayers(int newNbHiddenLayers);
98  void setNbNeuronsPerHiddenLayer(int newNbNeuronsPerHiddenLayer);
99  };
100 
102  private:
103  const int dataSizeDataSet;
104  int nbDataPerMiniBatchSet;
105  float*** inputsDataSet;
106  float*** targetsDataSet;
107  public:
108  DataSet(const int dataSize, int nbDataPerMiniBatch, float*** inputs, float*** targets);
109  const int getDataSize() const;
110  const int getNbDataPerMiniBatchSize() const;
111  float*** getInputs() const;
112  float*** getTargets() const;
113  };
114 
116  private :
117  const int nbEpochPerformed;
118  const int bestEpochOnValidationData;
119  const float meanOnTrainingData;
120  const float meanOnValidationData;
121 
122  public:
123  ResultTraining(const int nbEpochResult, const int bestEpochOnValidationDataResult, const float meanOnTrainingDataResult, const float meanOnValidationDataResult);
124  const int getNbEpochPerformed() const;
125  const int getBestEpochOnValidationData() const;
126  const float getMeanOnTrainingData() const;
127  const float getMeanOnValidationData() const;
128  ResultTraining* getDuplicata();
129  };
130 
140  private :
141  CscInitializationWeightsStrategy initWeightStrategy;
142  CscInitializationBiasStrategy initBiasStrategy;
143  CscLossFunction lossFunction;
144  CscOptimizer optimizer;
145  float learningRate;
146  float rho = 0.95f;
147  float beta1 = 0.9f;
148  float beta2 = 0.999f;
149  float epsilon = 0.00000001f;
150  int nbDataPerMiniBatch;
151  bool earlyStoppingActivation;
152  int patience;
154  public :
155  TrainingHyperparameters(CscInitializationWeightsStrategy initWeightStrategyInit, CscInitializationBiasStrategy initBiasStrategyInit, CscLossFunction lossFunctionInit, CscOptimizer optimizers, float learningRateInit, int nbDataPerMiniBatchInit, bool earlyStoppingInit, int patienceInit);
156  void setInitializationWeightsStrategy(CscInitializationWeightsStrategy initWeightStrategyUpdate);
157  void setInitializationBiasStrategy(CscInitializationBiasStrategy initBiasStrategyUpdate);
158  void setLossFunction(CscLossFunction lossFunctionUpdate);
159  void setOptimizer(CscOptimizer optimizerUpdate);
160  void setLearningRate(float learningRateUpdate);
161  void setRho(float rho);
162  void setBeta1(float beta1Update);
163  void setBeta2(float beta2Update);
164  void setEpsilon(float epsilonUpdate);
165  void setNbDataPerMiniBatch(int nbDataPerMiniBatchUpdate);
166  void setEarlyStoppingActivation(bool earlyStoppingUpdate);
167  void setPatience(int patienceUpdate);
168 
169  const CscInitializationWeightsStrategy getInitializationWeightsStrategy() const;
170  const CscInitializationBiasStrategy getInitializationBiasStrategy() const;
171  const CscLossFunction getLossFunction() const;
172  const CscOptimizer getOptimizer() const;
173  const float getLearningRate() const;
174  const float getRho() const;
175  const float getBeta1() const;
176  const float getBeta2() const;
177  const float getEpsilon() const;
178  const int getNbDataPerMiniBatch() const;
179  const bool getEarlyStoppingActivation() const;
180  const int getPatience() const;
181  TrainingHyperparameters* getDuplicata();
182  };
183 
185  private :
186  NeuralNetworkShape* neuralNetworkShape;
187  CscActivationFunction hiddenLayersFunctionActivation;
188  CscActivationFunction outputLayerFunctionActivation;
189 
190  public :
191  NeuralNetworkHyperparameters(NeuralNetworkShape* nnShape, CscActivationFunction hiddenLayersFunctActivation, CscActivationFunction outputLayerFunctActivation);
192 
194 
195  NeuralNetworkShape* getNeuralNetworkShape() const;
196  CscActivationFunction getHiddenLayersFunctionActivation() const;
197  CscActivationFunction getOutputLayerFunctionActivation() const;
198 
199  NeuralNetworkHyperparameters* getDuplicata();
200 
201  void setHiddenLayersFunctionActivation(CscActivationFunction newHiddenLayersFunctionActivation);
202  void setOutputLayerFunctionActivation(CscActivationFunction newOutputLayerFunctionActivation);
203 
204  };
205 
206 public:
207  CscNeuralNetwork(CscNeuralNetworkType neuralNetworkType, NeuralNetworkHyperparameters* neuralNetworkHyperparametersInit, TrainingHyperparameters* trainingHyperparametersInit);
208  CscNeuralNetwork(CscNeuralNetworkType neuralNetworkType, NeuralNetworkHyperparameters* neuralNetworkHyperparametersInit, TrainingHyperparameters* trainingHyperparametersInit, float** weightsLoadedFromModel, float** biasesLoadedFromModel);
209  virtual ~CscNeuralNetwork();
210 
211  CscNeuralNetworkType getNeuralNetworkType() const;
212  CscNeuralNetwork::NeuralNetworkHyperparameters* getNeuralNetworkHyperparameters() const;
213  CscNeuralNetwork::TrainingHyperparameters* getTrainingHyperparameters() const;
214 
238  virtual ResultTraining trainNeuralNetwork(const int nbEpochs, const int nbMiniBatchs, DataSet* trainingDataSet, DataSet* validationDataSet, const bool debugMode = false) = 0;
256  static float*** adaptDataForMiniBatches(float** dataToTransform, const int minibatchSize, const int dataSetSize);
257 
258  // normalization methods
259  static void normalizeDataAutoRange(float** data, size_t size, int nbInputsOrOutputs, CscNormalizationType normalizationType);
260  static void normalizeDataCustomRange0to1(float** data, size_t size, int nbInputsOrOutputs, float* minValue, float* maxValue);
261  static void normalizeDataCustomRangeMinus1to1(float** data, size_t size, int nbInputsOrOutputs, float* minValue, float* maxValue);
282  static void normalizeData(float** data, size_t size, int rowData, float newMin, float newMax, float minValue, float maxValue);
283 
299  static void deleteAllDataMiniBatches(float ***dataMiniBatches, const int nbMiniBatches, const int nbDataPerMinibatch);
300 
301  // Methods to initialate weights
328  static void initializeWeights(float* weightsToInitialize, int size, CscInitializationWeightsStrategy strategy, int fanIn, int fanOut = 0, float* weightsLoaded = nullptr);
329 
330  static void initializeBias(float* biasToInitialize, int size, CscInitializationBiasStrategy strategy, float* biasLoaded = nullptr);
331 
332 protected:
333  // Attributes
335  TrainingHyperparameters* trainingHyperparameters = nullptr;
336  NeuralNetworkHyperparameters* neuralNetworkHyperparameters = nullptr;
337  unique_ptr<CscLogger> logger;
338 
339  // Methods
340  virtual void createNeuralNetwork(CscActivationFunction hiddenLayersFunctionActivation, CscActivationFunction outputLayerFunctionActivation, CscLossFunction lossFunction, CscInitializationWeightsStrategy initilizationStrategy, CscInitializationBiasStrategy initializationBiasStrategy, bool withCostFunction) = 0;
341 
342  static float calculateStddevHe(int fanIn);
343  static float calculateLimitGlorot(int fanIn, int fanOut);
344  static float calculateStddevGlorot(int fanIn, int fanOut);
345  static float calculateStddevLeCun(int fanIn);
346  static void initNormal(float* weights, int size, mt19937& gen, double stddev);
347  static void initUniform(float* weights, int size, mt19937& gen, float limit);
348 
361  void shuffleMinibatchData(float*** minibatchDataInputs, float*** minibatchDataTargets, const int numberOfBatches, const int minibatchSize);
362 };
363 }
364 
365 #endif /* CSCNEURALNETWORK_H_ */
conscience_core::ai::nn::GradientDescent
@ GradientDescent
Definition: CscNeuralNetwork.h:73
conscience_core::ai::nn::CscInitializationBiasStrategy
CscInitializationBiasStrategy
Definition: CscNeuralNetwork.h:61
conscience_core::ai::nn::Rint
@ Rint
Definition: CscNeuralNetwork.h:38
CSC_DLL_IMPORTEXPORT
#define CSC_DLL_IMPORTEXPORT
Definition: os.h:34
conscience_core::ai::nn::Linear
@ Linear
Definition: CscNeuralNetwork.h:29
conscience_core::ai::nn::CscNeuralNetwork::DataSet
Definition: CscNeuralNetwork.h:101
conscience_core::ai::nn::Selu
@ Selu
Definition: CscNeuralNetwork.h:31
conscience_core::ai::nn::CscNeuralNetwork::NeuralNetworkHyperparameters
Definition: CscNeuralNetwork.h:184
conscience_core::ai::nn::Adadelta
@ Adadelta
Definition: CscNeuralNetwork.h:75
conscience_core::ai::nn::Softsign
@ Softsign
Definition: CscNeuralNetwork.h:40
conscience_core::ai::nn::Expm1
@ Expm1
Definition: CscNeuralNetwork.h:35
conscience_core::ai::nn::Tanh
@ Tanh
Definition: CscNeuralNetwork.h:30
conscience_core::ai::nn::CscNeuralNetworkType
CscNeuralNetworkType
Definition: CscNeuralNetwork.h:20
conscience_core::ai::nn
Definition: CscNeuralNetwork.cpp:12
conscience_core::ai::nn::CscNeuralNetwork::NeuralNetworkShape
Definition: CscNeuralNetwork.h:81
conscience_core::ai::nn::CscInitializationWeightsStrategy
CscInitializationWeightsStrategy
Definition: CscNeuralNetwork.h:53
conscience_core::ai::nn::HingeLoss
@ HingeLoss
Definition: CscNeuralNetwork.h:50
conscience_core::ai::nn::Softplus
@ Softplus
Definition: CscNeuralNetwork.h:41
conscience_core::ai::nn::Range0To1
@ Range0To1
Definition: CscNeuralNetwork.h:69
conscience_core::ai::nn::MeanAbsoluteError
@ MeanAbsoluteError
Definition: CscNeuralNetwork.h:49
conscience_core::ai::nn::Zero
@ Zero
Definition: CscNeuralNetwork.h:63
conscience_core::ai::nn::Elu
@ Elu
Definition: CscNeuralNetwork.h:31
conscience_core::ai::nn::Acosh
@ Acosh
Definition: CscNeuralNetwork.h:32
conscience_core::ai::nn::CscNeuralNetwork::logger
unique_ptr< CscLogger > logger
Definition: CscNeuralNetwork.h:337
conscience_core::ai::nn::Relu
@ Relu
Definition: CscNeuralNetwork.h:31
conscience_core::ai::nn::RecurrentNeuralNetwork
@ RecurrentNeuralNetwork
Definition: CscNeuralNetwork.h:23
conscience_core::ai::nn::LittleValue
@ LittleValue
Definition: CscNeuralNetwork.h:64
conscience_core::ai::nn::RangeMinus1To1
@ RangeMinus1To1
Definition: CscNeuralNetwork.h:68
conscience_core::ai::nn::Sqrt
@ Sqrt
Definition: CscNeuralNetwork.h:42
conscience_core::ai::nn::Asin
@ Asin
Definition: CscNeuralNetwork.h:32
conscience_core::ai::nn::CscActivationFunction
CscActivationFunction
Definition: CscNeuralNetwork.h:27
conscience_core::ai::nn::CscNeuralNetwork::neuralNetworkType
CscNeuralNetworkType neuralNetworkType
Definition: CscNeuralNetwork.h:334
conscience_core::ai::nn::Exp
@ Exp
Definition: CscNeuralNetwork.h:35
conscience_core::ai::nn::Sinh
@ Sinh
Definition: CscNeuralNetwork.h:32
CscCommon.h
conscience_core::ai::nn::Sign
@ Sign
Definition: CscNeuralNetwork.h:39
conscience_core::ai::nn::CscNeuralNetwork::TrainingHyperparameters
Structure representing the hyperparameters for model training.
Definition: CscNeuralNetwork.h:139
conscience_core::ai::nn::Atan
@ Atan
Definition: CscNeuralNetwork.h:32
conscience_core::ai::nn::Ceil
@ Ceil
Definition: CscNeuralNetwork.h:33
conscience_core::ai::nn::CscNeuralNetwork::ResultTraining
Definition: CscNeuralNetwork.h:115
conscience_core::ai::nn::LeCunNormal
@ LeCunNormal
Definition: CscNeuralNetwork.h:58
conscience_core::ai::nn::DenseNeuralNetwork
@ DenseNeuralNetwork
Definition: CscNeuralNetwork.h:22
conscience_core::ai::nn::Sigmoid
@ Sigmoid
Definition: CscNeuralNetwork.h:30
conscience_core::ai::nn::CscLossFunction
CscLossFunction
Definition: CscNeuralNetwork.h:46
conscience_core::ai::nn::GlorotUniform
@ GlorotUniform
Definition: CscNeuralNetwork.h:56
conscience_core::ai::nn::He
@ He
Definition: CscNeuralNetwork.h:55
conscience_core::ai::nn::Adagrad
@ Adagrad
Definition: CscNeuralNetwork.h:74
conscience_core::ai::nn::BiasesLoadFromModel
@ BiasesLoadFromModel
Definition: CscNeuralNetwork.h:62
conscience_core::ai::nn::Asinh
@ Asinh
Definition: CscNeuralNetwork.h:32
conscience_core::ai::nn::GlorotNormal
@ GlorotNormal
Definition: CscNeuralNetwork.h:57
conscience_core::ai::nn::MeanSquaredError
@ MeanSquaredError
Definition: CscNeuralNetwork.h:48
conscience_core::ai::nn::Atanh
@ Atanh
Definition: CscNeuralNetwork.h:32
conscience_core::ai::nn::Erf
@ Erf
Definition: CscNeuralNetwork.h:34
conscience_core::ai::nn::CscNeuralNetwork
Definition: CscNeuralNetwork.h:79
conscience_core::ai::nn::LeakyRelu
@ LeakyRelu
Definition: CscNeuralNetwork.h:31
conscience_core::ai::nn::CscNormalizationType
CscNormalizationType
Definition: CscNeuralNetwork.h:67
conscience_core::ai::nn::Log
@ Log
Definition: CscNeuralNetwork.h:37
conscience_core::ai::nn::Log1p
@ Log1p
Definition: CscNeuralNetwork.h:37
conscience_core::ai::nn::Floor
@ Floor
Definition: CscNeuralNetwork.h:36
conscience_core::ai::nn::CscOptimizer
CscOptimizer
Definition: CscNeuralNetwork.h:72
conscience_core::ai::nn::Adam
@ Adam
Definition: CscNeuralNetwork.h:76
conscience_core::ai::nn::Relu6
@ Relu6
Definition: CscNeuralNetwork.h:31
conscience_core::ai::nn::WeightsLoadFromModel
@ WeightsLoadFromModel
Definition: CscNeuralNetwork.h:54