// // ParameterOptimizer.hpp // MNN // // Created by MNN on 2019/11/22. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef ParameterOptimizer_hpp #define ParameterOptimizer_hpp #include #include #include namespace MNN { namespace Train { class MNN_PUBLIC ParameterOptimizer { public: enum RegularizationMethod { L1, L2, L1L2, }; ParameterOptimizer(std::shared_ptr module); virtual ~ParameterOptimizer() = default; bool step(Express::VARP loss); int currentStep(); void setCurrentStep(int step); static void makeLoopModel(const char* mnnFileName, std::vector outputs, const std::pair, std::vector>& parameters); struct ParameterOptGrad { Express::VARP parameter; Express::VARP parameterGrad; Express::VARP learningRate; }; virtual std::map onGetNextParameter(Express::VARP loss) = 0; virtual std::pair, std::vector> onMakeParameterUpdateGraphByGrad(const std::vector& parameterGrads); std::pair, std::vector> makeParameterUpdateGraphByGrad(const std::vector& p, const std::vector& pd, const std::vector& lr); static ParameterOptimizer* createSGD(std::shared_ptr module, float lr, float momentum, float weightDecay, RegularizationMethod method); static ParameterOptimizer* createADAM(std::shared_ptr module, float lr, float momentum, float momentum2, float weightDecay, float eps, RegularizationMethod method); protected: const std::set& trainable() const { return mTrainable; } std::shared_ptr module() const { return mModule; } private: int mStep = 0; std::shared_ptr mModule; std::set mTrainable; }; } // namespace Train } // namespace MNN #endif