Skip to content
Snippets Groups Projects
Commit ce427787 authored by Martin Beseda's avatar Martin Beseda
Browse files

[ENH] Added parameters to ACSF optimizer to make the parameters' fitting more flexible.

parent 851e118a
No related branches found
No related tags found
No related merge requests found
......@@ -30,19 +30,30 @@ lib4neuro::ACSFParametersOptimizer::ACSFParametersOptimizer(lib4neuro::ErrorFunc
void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETRY_FUNCTION_PARAMETER>& fitted_params,
bool random_init_params) {
fit_ACSF_parameters(fitted_params,
random_init_params,
30,
10,
1e-5,
0.98,
0.085,
1e-6);
}
void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETRY_FUNCTION_PARAMETER>& fitted_params,
bool random_init_params,
unsigned int main_iterations_num,
unsigned int steady_temperature_iters_num,
double init_temperature,
double temperature_change,
double distribution_stddev,
double termination_threshold) {
COUT_INFO("Starting optimizing of ACSF parameters...");
/* Seed the random numbers' generator */
std::random_device rd{};
std::mt19937 gen{rd()};
// GradientDescentBB gd(1e-6,
// 1000,
// 10000);
//
// LevenbergMarquardt lm(1000);
/* Construct and train a new linear neural network to evaluate the chosen symmetry functions' parameters */
std::vector<unsigned int> neuron_numbers = {static_cast<unsigned int>(this->net->get_input_neurons_number()), 1};
std::vector<NEURON_TYPE> type_hidden_neurons = {};
......@@ -81,16 +92,16 @@ void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETR
double current_error;
double delta_error;
double temperature = 3e-4; //TODO make flexible by adding function parameters
double temperature = init_temperature; //TODO make flexible by adding function parameters
MSE mse_init(&nn, this->data_set);
previous_error = mse_init.eval();
/* Iteratively improve the parameters */
unsigned int iter_ind = 0;
for(unsigned int i = 0; i < 10; i++) {
for(unsigned int i = 0; i < main_iterations_num; i++) {
/* Temperature iterations */
for(unsigned int j = 0; j < 10; j++) {
for(unsigned int j = 0; j < steady_temperature_iters_num; j++) {
/* Change the selected parameters in ACSFs */
for (auto& el : *this->net->get_elements()) {
for (auto& func : *el.second->getSymmetryFunctions()) {
......@@ -103,7 +114,7 @@ void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETR
func->set_parameter(param.first,
shift_max_vals.at((int) (d_uni(gen))));
} else {
std::normal_distribution<> dd{param.second, 0.085};
std::normal_distribution<> dd{param.second, distribution_stddev};
func->set_parameter(param.first,
dd(gen));
}
......@@ -124,18 +135,16 @@ void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETR
MSE mse(&nn,
this->data_set);
// gd.optimize(mse);
std::vector<double> new_weights = arma::conv_to<std::vector<double>>::from(
arma::solve(*this->data_set->get_inputs_matrix(),
*this->data_set->get_outputs_matrix(),
arma::solve_opts::fast));
*this->data_set->get_outputs_matrix(),
arma::solve_opts::fast));
nn.copy_parameter_space(&new_weights);
current_error = mse.eval();
/* Termination condition */
if(current_error < 10e-6) {
if(current_error < termination_threshold) {
COUT_INFO("Error when optimizing ACSF parameters: " + std::to_string(current_error));
return;
}
......@@ -162,10 +171,9 @@ void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETR
previous_error = current_error;
std::cout << "it: " << iter_ind << " Delta error: " << delta_error << std::endl;
iter_ind++;
}
temperature *= 0.98;
temperature *= temperature_change;
}
}
......@@ -26,6 +26,15 @@ namespace lib4neuro {
LIB4NEURO_API void fit_ACSF_parameters(std::vector<SYMMETRY_FUNCTION_PARAMETER>& fitted_params,
bool random_init_params);
LIB4NEURO_API void fit_ACSF_parameters(std::vector<SYMMETRY_FUNCTION_PARAMETER>& fitted_params,
bool random_init_params,
unsigned int main_iterations_num,
unsigned int steady_temperature_iters_num,
double init_temperature,
double temperature_change,
double distribution_stddev,
double termination_threshold);
};
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment