Conscience Core
CscNeuralNetworkBuilderTensorFlow.h
Go to the documentation of this file.
1 /*
2  *CscNeuralNetworkBuilderTensorFlow.h
3  *
4  * Created on: 24 juillet 2024
5  * Author: Max Lhermitte
6  */
7 
8 #ifndef CSCNEURALNETWORKBUILDERTENSORFLOW_H_
9 #define CSCNEURALNETWORKBUILDERTENSORFLOW_H_
10 
12 #include "Util/conscience_util.h"
13 #include "CscCommon.h"
14 #include "tensorflow/c/c_api.h"
15 #include "Util/json.h"
17 
18 using namespace conscience_utils::JSON;
19 
20 
21 namespace conscience_core::ai::nn {
22 
24 public:
25  CscNeuralNetworkBuilderTensorFlow(CscNeuralNetwork::TrainingHyperparameters *trainingHypeparametersInit, CscNeuralNetwork::NeuralNetworkHyperparameters *nnHyperparametersInit, float **weightsLoadedFromModelInit = nullptr, float **biasesLoadedFromModelInit = nullptr);
27 
28  // public methods
29  TF_Graph *getGraph() const;
30  TF_Status *getStatus() const;
31  TF_Operation *getGraphOperation() const;
32  TF_Output *getTrainableVars();
33  TF_Output *getPartialDerivatives();
34  vector<const char *> &getAssignationsInitNames();
35  vector<const char *> &getAssignationsBestValuesNames();
36  vector<const char *> &getAssignationsInitAdagradNames();
37  vector<const char *> &getAssignationsInitAdadeltaGradientNames();
38  vector<const char *> &getAssignationsInitAdadeltaUpdateNames();
39  vector<const char *> &getAssignationsInitAdamFirstMomentNames();
40  vector<const char *> &getAssignationsInitAdamSecondMomentNames();
41  vector<const char *> &getVarNames();
42  vector<const char *> &getVarBestValueNames();
43  vector<const char *> &getVarAdagradValueNames();
44  vector<const char *> &getVarAdadeltaGradientValueNames();
45  vector<const char *> &getVarAdadeltaUpdateValueNames();
46  vector<const char *> &getVarAdamFirstMomentValueNames();
47  vector<const char *> &getVarAdamSecondMomentValueNames();
48  vector<const char *> &getUpdateNames();
49 
50  void setWeightsLoadedFromModel(float **weightsLoadedFromModelUpdate);
51  void setBiasesLoadedFromModel(float **biasesLoadedFromModelUpdate);
52 
53  // Methods for TF_Output list allocations and initialization
54  void allocatePartialDerivatives(int nbOperations);
55 
56  void allocateAndInitializeTrainableVars(int nbOperations);
57  void allocateAndInitializeAccumulators(int nbOperations);
58  void allocateAndInitializeGradientAccumulators(int nbOperations);
59  void allocateAndInitializeUpdateAccumulators(int nbOperations);
60  void allocateAndInitializeMFirstMomentEstimateOutputs(int nbOperations);
61  void allocateAndInitializeVSecondMomentEstimateOutputs(int nbOperations);
62 
63  // Methods for layers operations
64  void createVariableInGraph(const int64_t *dims, int num_dims, float *data, int num_data, char *name);
65  void createConstantVariableAndAssignOperation(const char *namePrefix, const char *variablePrefix, const char *assignPrefix, const char *name, int numDims, const int64_t *dims, int numData, std::vector<const char *> &valueNames, std::vector<const char *> &assignNames, float *constantValue);
66  TF_Operation *createOperationFromTwoOperations(TF_Operation *a, TF_Operation *b, const char *operationString, const char *operationName);
67  TF_Operation *createOperationFromSingleOperation(TF_Operation *operation, const char *operationString, const char *operationName);
68  TF_Operation *createConstOperation(TF_Tensor *tensor, char *name, TF_DataType dataType);
69  TF_Operation *createVariableV2Operation(const int64_t *dims, int numDims, const char *name, TF_DataType dataType);
70  TF_Operation *createMatriceMultiplicationOperation(TF_Operation *a, TF_Operation *b);
71  TF_Operation *createAdditionOperation(TF_Operation *a, TF_Operation *b);
72  TF_Operation *createActivationFunctionOperation(TF_Operation *input_op, CscActivationFunction activFuncName, int nbActivationFunctionOperation);
73  TF_Operation *createPlaceHolderOperation(int numFeatures, const char *name);
74  TF_Operation *createDenseLayerOperation(TF_Operation *input, const char *weightVarName, const char *biasVarName, CscActivationFunction activFuncName, int denseLayerId);
75 
76  // Methods for create neural network operation
77  TF_Operation *createInputLayerOperation(int numFeatures);
78  TF_Operation *createDenseLayer(int hiddenLayerId, int nbNeuronsPreviousLayer, int nbNeuronsLayer, TF_Operation *previousLayer, CscActivationFunction fctActivationName, CscInitializationWeightsStrategy initilizationStrategy, CscInitializationBiasStrategy initializationBiasStrategy);
79  TF_Operation *createOutputLayerOperation(int nbNeuronsPreviousLayer, TF_Operation *previousLayer, CscActivationFunction fctActivationName, CscLossFunction lossFunction, CscInitializationWeightsStrategy initializationStrategy, CscInitializationBiasStrategy initializationBiasStrategy, bool withCostFunction);
80  TF_Operation *createTargetPlaceHoldersOperation();
94  void createNeuralNetwork(CscActivationFunction hiddenLayersFunctionActivation, CscActivationFunction outputLayerFunctionActivation, CscLossFunction lossFunction, CscInitializationWeightsStrategy initilizationStrategy, CscInitializationBiasStrategy initializationBiasStrategy, bool withCostFunction);
95 
96  // Loss functions
97  TF_Operation *createCostFunctionOperation(TF_Operation *predictions, CscLossFunction lossFunction);
98  TF_Operation *createMeanSquaredErrorCostFunctionOperation(TF_Operation *predictions);
99  TF_Operation *createMeanAbsoluteErrorCostFunctionOperation(TF_Operation *predictions);
100 
101  // update operations
102  TF_Operation *createUpdateOperation(CscOptimizer optimizer, int nthVariable);
103  TF_Operation *createGradientDescentUpdateOperation(TF_Output variable, TF_Output gradient);
104  TF_Operation *createAdagradUpdateOperation(TF_Output variable, TF_Output gradient, TF_Output accumulation);
105  TF_Operation *createAdadeltaUpdateOperation(TF_Output variable, TF_Output gradient, TF_Output accumGrad, TF_Output accumUpdate);
106  TF_Operation *createAdamUpdateOperation(TF_Output variable, TF_Output gradient, TF_Output mFirstMomentEstimate, TF_Output vSecondMomentEstimate);
107  void createAllUpdtateOperations(CscOptimizer optimizer);
108 
109  static int printTensorShapeOfOperationAndReturnNumberNeurons(TF_Graph *graph, const char *operationName);
110 
111 private:
112  unique_ptr<CscLogger> loggerBuilder;
113  CscNeuralNetwork::TrainingHyperparameters *trainingHyperparameters = nullptr;
114  CscNeuralNetwork::NeuralNetworkHyperparameters *neuralNetworkHyperparameters = nullptr;
115 
116  // Attributes
117  TF_Graph *graph = nullptr;
118  TF_Status *status = nullptr;
119  TF_Operation *graphOperation = nullptr;
120  TF_Output *partialDerivatives = nullptr;
121  TF_Output *trainableVars = nullptr;
122  TF_Output *accumulators = nullptr;
123  TF_Output *gradientAccumulators = nullptr;
124  TF_Output *updateAccumulators = nullptr;
125  TF_Output *mFirstMomentEstimateOutputs = nullptr;
126  TF_Output *vSecondMomentEstimateOutputs = nullptr;
127  int timeCounter = 0;
128  long counterOperations;
129  vector<const char *> assignationsInitNames;
130  vector<const char *> assignationsBestValuesNames;
131  vector<const char *> assignationsInitAdagradNames;
132  vector<const char *> assignationsInitAdadeltaGradientNames;
133  vector<const char *> assignationsInitAdadeltaUpdateNames;
134  vector<const char *> assignationsInitAdamFirstMomentNames;
135  vector<const char *> assignationsInitAdamSecondMomentNames;
136  vector<const char *> varNames;
137  vector<const char *> varBestValueNames;
138  vector<const char *> varAdagradValueNames;
139  vector<const char *> varAdadeltaGradientValueNames;
140  vector<const char *> varAdadeltaUpdateValueNames;
141  vector<const char *> varAdamFirstMomentValueNames;
142  vector<const char *> varAdamSecondMomentValueNames;
143  vector<const char *> updateNames;
144  float **weightsLoadedFromModel = nullptr;
145  float **biasesLoadedFromModel = nullptr;
146 
147  // Debug methods
148  void printTensor(TF_Tensor *tensor);
149 
150  // Others methods
151  const char *generateUniqueCharArray();
168  bool checkStatus(const string methodName);
169  template<typename T> TF_Tensor *createScalarTensor(T value);
170  void allocateAndInitializeTF_OutputList(TF_Output **listTF_Output, const vector<const char *> &namesTF_Output, int nbOperations);
171 };
172 }
173 
174 #endif /* CSCNEURALNETWORKBUILDERTENSORFLOW_H_ */
conscience_core::ai::nn::CscInitializationBiasStrategy
CscInitializationBiasStrategy
Definition: CscNeuralNetwork.h:61
CSC_DLL_IMPORTEXPORT
#define CSC_DLL_IMPORTEXPORT
Definition: os.h:31
conscience_util.h
conscience_core::ai::nn::CscNeuralNetwork::NeuralNetworkHyperparameters
Definition: CscNeuralNetwork.h:184
conscience_core::ai::nn
Definition: CscNeuralNetwork.cpp:12
conscience_core::ai::nn::CscInitializationWeightsStrategy
CscInitializationWeightsStrategy
Definition: CscNeuralNetwork.h:53
CscNeuralNetwork.h
conscience_core::ai::nn::CscNeuralNetworkBuilderTensorFlow
Definition: CscNeuralNetworkBuilderTensorFlow.h:23
conscience_core::ai::nn::CscActivationFunction
CscActivationFunction
Definition: CscNeuralNetwork.h:27
conscience_utils::JSON
Definition: CscCommandMetadataBuilder.h:20
CscCommon.h
conscience_core::ai::nn::CscNeuralNetwork::TrainingHyperparameters
Structure representing the hyperparameters for model training.
Definition: CscNeuralNetwork.h:139
conscience_core::ai::nn::CscLossFunction
CscLossFunction
Definition: CscNeuralNetwork.h:46
CscNeuralNetworkPersistenceTensorFlow.h
json.h
conscience_core::ai::nn::CscOptimizer
CscOptimizer
Definition: CscNeuralNetwork.h:72