27 #ifndef TMVA_DNN_OPTIMIZER
28 #define TMVA_DNN_OPTIMIZER
42 template <
typename Architecture_t,
typename Layer_t = VGeneralLayer<Architecture_t>,
43 typename DeepNet_t = TDeepNet<Architecture_t, Layer_t>>
46 using Matrix_t =
typename Architecture_t::Matrix_t;
47 using Scalar_t =
typename Architecture_t::Scalar_t;
50 Scalar_t fLearningRate;
56 UpdateWeights(
size_t layerIndex, std::vector<Matrix_t> &weights,
const std::vector<Matrix_t> &weightGradients) = 0;
60 UpdateBiases(
size_t layerIndex, std::vector<Matrix_t> &biases,
const std::vector<Matrix_t> &biasGradients) = 0;
64 VOptimizer(Scalar_t learningRate, DeepNet_t &deepNet);
70 virtual ~VOptimizer() =
default;
73 void IncrementGlobalStep() { this->fGlobalStep++; }
76 Scalar_t GetLearningRate()
const {
return fLearningRate; }
77 size_t GetGlobalStep()
const {
return fGlobalStep; }
78 std::vector<Layer_t *> &GetLayers() {
return fDeepNet.GetLayers(); }
79 Layer_t *GetLayerAt(
size_t i) {
return fDeepNet.GetLayerAt(i); }
82 void SetLearningRate(
size_t learningRate) { fLearningRate = learningRate; }
89 template <
typename Architecture_t,
typename Layer_t,
typename DeepNet_t>
90 VOptimizer<Architecture_t, Layer_t, DeepNet_t>::VOptimizer(Scalar_t learningRate, DeepNet_t &deepNet)
91 : fLearningRate(learningRate), fGlobalStep(0), fDeepNet(deepNet)
96 template <
typename Architecture_t,
typename Layer_t,
typename DeepNet_t>
97 auto VOptimizer<Architecture_t, Layer_t, DeepNet_t>::Step() ->
void
99 for (
size_t i = 0; i < this->GetLayers().size(); i++) {
100 this->UpdateWeights(i, this->GetLayerAt(i)->GetWeights(), this->GetLayerAt(i)->GetWeightGradients());
101 this->UpdateBiases(i, this->GetLayerAt(i)->GetBiases(), this->GetLayerAt(i)->GetBiasGradients());