//============================================================================ // Name : MLP.cpp // Author : David Nogueira //============================================================================ #ifndef MLP_H #define MLP_H #include #include #include #include #include #include #include #include #include "Layer.h" #include "Sample.h" #include "MLPUtils.h" class MLP { public: //desired call syntax : MLP({64*64,20,4}, {"sigmoid", "linear"}, MLP(const std::vector & layers_nodes, const std::vector & layers_activfuncs, bool use_constant_weight_init = false, double constant_weight_init = 0.5); MLP(const std::string & filename); ~MLP(); void SaveMLPNetwork(const std::string & filename)const; void LoadMLPNetwork(const std::string & filename); void GetOutput(const std::vector &input, std::vector * output, std::vector> * all_layers_activations = nullptr) const; void GetOutputClass(const std::vector &output, size_t * class_id) const; void Train(const std::vector &training_sample_set_with_bias, double learning_rate, int max_iterations = 5000, double min_error_cost = 0.001, bool output_log = true); size_t GetNumLayers(); std::vector> GetLayerWeights( size_t layer_i ); void SetLayerWeights( size_t layer_i, std::vector> & weights ); protected: void UpdateWeights(const std::vector> & all_layers_activations, const std::vector &error, double learning_rate); private: void CreateMLP(const std::vector & layers_nodes, const std::vector & layers_activfuncs, bool use_constant_weight_init, double constant_weight_init = 0.5); size_t m_num_inputs{ 0 }; int m_num_outputs{ 0 }; int m_num_hidden_layers{ 0 }; std::vector m_layers_nodes; std::vector m_layers; }; #endif //MLP_H