9 #include "incremental_neurons.h"
39 from_XML(incremental_order_document);
91 #ifdef __OPENNN_DEBUG__
97 buffer <<
"OpenNN Exception: IncrementalNeurons class.\n"
98 <<
"void set_step(const size_t&) method.\n"
99 <<
"New_step(" << new_step <<
") must be greater than 0.\n";
101 throw logic_error(buffer.str());
106 ostringstream buffer;
108 buffer <<
"OpenNN Exception: IncrementalNeurons class.\n"
109 <<
"void set_step(const size_t&) method.\n"
110 <<
"New_step must be less than the distance between maximum_order and minimum_order(" <<
maximum_order-
minimum_order <<
").\n";
112 throw logic_error(buffer.str());
126 #ifdef __OPENNN_DEBUG__
128 if(new_maximum_loss_failures <= 0)
130 ostringstream buffer;
132 buffer <<
"OpenNN Exception: IncrementalNeurons class.\n"
133 <<
"void set_maximum_selection_failures(const size_t&) method.\n"
134 <<
"Maximum selection failures must be greater than 0.\n";
136 throw logic_error(buffer.str());
153 cout <<
"Performing Incremental neurons selection..." << endl;
161 const size_t trainable_layers_number = neural_network->get_trainable_layers_number();
167 double prev_selection_error = numeric_limits<double>::max();
171 double optimum_training_loss = 0.0;
172 double optimum_selection_error = 0.0;
174 double current_training_loss = 0.0;
175 double current_selection_error = 0.0;
181 size_t optimal_neurons_number = 0;
184 size_t iterations = 0;
185 size_t selection_failures = 0;
189 time_t beginning_time, current_time;
190 double elapsed_time = 0.0;
192 time(&beginning_time);
200 trainable_layers_pointers[trainable_layers_number-2]->set_neurons_number(neurons_number);
201 trainable_layers_pointers[trainable_layers_number-1]->set_inputs_number(neurons_number);
205 double optimum_selection_error_trial = numeric_limits<double>::max();
206 double optimum_training_error_trial = numeric_limits<double>::max();
215 const double current_training_error_trial = optimization_algorithm_results.
final_training_error;
219 if(current_selection_error_trial < optimum_selection_error_trial)
221 optimum_training_error_trial = current_training_error_trial;
222 optimum_selection_error_trial = current_selection_error_trial;
223 optimum_parameters_trial = current_parameters_trial;
228 cout <<
"Trial number: " << i << endl;
229 cout <<
"Training error: " << current_training_error_trial << endl;
230 cout <<
"Selection error: " << current_selection_error_trial << endl;
235 current_training_loss = optimum_training_error_trial;
236 current_selection_error = optimum_selection_error_trial;
237 current_parameters = optimum_parameters_trial;
241 elapsed_time = difftime(current_time, beginning_time);
256 ||(optimum_selection_error > current_selection_error
257 && abs(optimum_selection_error - current_selection_error) >
tolerance))
259 optimal_neurons_number = neurons_number;
260 optimum_training_loss = current_training_loss;
261 optimum_selection_error = current_selection_error;
262 optimal_parameters = current_parameters;
264 else if(prev_selection_error < current_selection_error)
266 selection_failures++;
269 prev_selection_error = current_selection_error;
278 if(
display) cout <<
"Maximum time reached." << endl;
286 if(
display) cout <<
"Selection loss reached." << endl;
294 if(
display) cout <<
"Maximum number of iterations reached." << endl;
302 if(
display) cout <<
"Maximum selection failures (" << selection_failures <<
") reached." << endl;
310 if(
display) cout <<
"Algorithm finished." << endl;
317 cout <<
"Iteration: " << iterations << endl
318 <<
"Hidden neurons number: " << neurons_number << endl
319 <<
"Training loss: " << current_training_loss << endl
320 <<
"Selection error: " << current_selection_error << endl
321 <<
"Elapsed time: " << write_elapsed_time(elapsed_time) << endl << endl;
332 <<
"Optimal order: " << optimal_neurons_number << endl
333 <<
"Optimum selection error: " << optimum_selection_error << endl
334 <<
"Corresponding training loss: " << optimum_training_loss << endl;
342 trainable_layers_pointers[trainable_layers_number-1]->set_inputs_number(optimal_neurons_number);
343 trainable_layers_pointers[trainable_layers_number-2]->set_neurons_number(optimal_neurons_number);
368 ostringstream buffer;
375 labels.push_back(
"Minimum order");
380 values.push_back(buffer.str());
384 labels.push_back(
"Maximum order");
389 values.push_back(buffer.str());
393 labels.push_back(
"Step");
398 values.push_back(buffer.str());
402 labels.push_back(
"Trials number");
407 values.push_back(buffer.str());
411 labels.push_back(
"Tolerance");
416 values.push_back(buffer.str());
420 labels.push_back(
"Selection loss goal");
425 values.push_back(buffer.str());
429 labels.push_back(
"Maximum selection failures");
434 values.push_back(buffer.str());
438 labels.push_back(
"Maximum iterations number");
443 values.push_back(buffer.str());
447 labels.push_back(
"Maximum time");
452 values.push_back(buffer.str());
456 labels.push_back(
"Plot training error history");
469 values.push_back(buffer.str());
473 labels.push_back(
"Plot selection error history");
486 values.push_back(buffer.str());
488 const size_t rows_number = labels.size();
489 const size_t columns_number = 2;
496 return string_matrix;
505 ostringstream buffer;
513 document->InsertFirstChild(root_element);
520 element = document->NewElement(
"MinimumOrder");
521 root_element->LinkEndChild(element);
526 text = document->NewText(buffer.str().c_str());
527 element->LinkEndChild(text);
532 element = document->NewElement(
"MaximumOrder");
533 root_element->LinkEndChild(element);
538 text = document->NewText(buffer.str().c_str());
539 element->LinkEndChild(text);
544 element = document->NewElement(
"Step");
545 root_element->LinkEndChild(element);
550 text = document->NewText(buffer.str().c_str());
551 element->LinkEndChild(text);
556 element = document->NewElement(
"TrialsNumber");
557 root_element->LinkEndChild(element);
562 text = document->NewText(buffer.str().c_str());
563 element->LinkEndChild(text);
592 element = document->NewElement(
"Tolerance");
593 root_element->LinkEndChild(element);
598 text = document->NewText(buffer.str().c_str());
599 element->LinkEndChild(text);
604 element = document->NewElement(
"SelectionErrorGoal");
605 root_element->LinkEndChild(element);
610 text = document->NewText(buffer.str().c_str());
611 element->LinkEndChild(text);
628 element = document->NewElement(
"MaximumSelectionFailures");
629 root_element->LinkEndChild(element);
634 text = document->NewText(buffer.str().c_str());
635 element->LinkEndChild(text);
640 element = document->NewElement(
"MaximumTime");
641 root_element->LinkEndChild(element);
646 text = document->NewText(buffer.str().c_str());
647 element->LinkEndChild(text);
652 element = document->NewElement(
"ReserveTrainingErrorHistory");
653 root_element->LinkEndChild(element);
658 text = document->NewText(buffer.str().c_str());
659 element->LinkEndChild(text);
664 element = document->NewElement(
"ReserveSelectionErrorHistory");
665 root_element->LinkEndChild(element);
670 text = document->NewText(buffer.str().c_str());
671 element->LinkEndChild(text);
683 ostringstream buffer;
689 file_stream.OpenElement(
"MinimumOrder");
694 file_stream.
PushText(buffer.str().c_str());
700 file_stream.OpenElement(
"MaximumOrder");
705 file_stream.
PushText(buffer.str().c_str());
711 file_stream.OpenElement(
"Step");
716 file_stream.
PushText(buffer.str().c_str());
722 file_stream.OpenElement(
"TrialsNumber");
727 file_stream.
PushText(buffer.str().c_str());
733 file_stream.OpenElement(
"Tolerance");
738 file_stream.
PushText(buffer.str().c_str());
744 file_stream.OpenElement(
"SelectionErrorGoal");
749 file_stream.
PushText(buffer.str().c_str());
755 file_stream.OpenElement(
"MaximumSelectionFailures");
760 file_stream.
PushText(buffer.str().c_str());
766 file_stream.OpenElement(
"MaximumTime");
771 file_stream.
PushText(buffer.str().c_str());
777 file_stream.OpenElement(
"ReserveTrainingErrorHistory");
782 file_stream.
PushText(buffer.str().c_str());
788 file_stream.OpenElement(
"ReserveSelectionErrorHistory");
793 file_stream.
PushText(buffer.str().c_str());
811 ostringstream buffer;
813 buffer <<
"OpenNN Exception: IncrementalNeurons class.\n"
814 <<
"void from_XML(const tinyxml2::XMLDocument&) method.\n"
815 <<
"IncrementalNeurons element is nullptr.\n";
817 throw logic_error(buffer.str());
826 const size_t new_minimum_order = static_cast<size_t>(atoi(element->GetText()));
832 catch(
const logic_error& e)
834 cerr << e.what() << endl;
845 const size_t new_maximum_order = static_cast<size_t>(atoi(element->GetText()));
851 catch(
const logic_error& e)
853 cerr << e.what() << endl;
864 const size_t new_step = static_cast<size_t>(atoi(element->GetText()));
870 catch(
const logic_error& e)
872 cerr << e.what() << endl;
883 const size_t new_trials_number = static_cast<size_t>(atoi(element->GetText()));
889 catch(
const logic_error& e)
891 cerr << e.what() << endl;
902 const string new_loss_calculation_method = element->GetText();
908 catch(
const logic_error& e)
910 cerr << e.what() << endl;
917 const tinyxml2::XMLElement* element = root_element->FirstChildElement(
"ReserveTrainingErrorHistory");
921 const string new_reserve_error_data = element->GetText();
927 catch(
const logic_error& e)
929 cerr << e.what() << endl;
936 const tinyxml2::XMLElement* element = root_element->FirstChildElement(
"ReserveSelectionErrorHistory");
940 const string new_reserve_selection_error_data = element->GetText();
946 catch(
const logic_error& e)
948 cerr << e.what() << endl;
955 const tinyxml2::XMLElement* element = root_element->FirstChildElement(
"ReserveMinimalParameters");
959 const string new_reserve_minimal_parameters = element->GetText();
965 catch(
const logic_error& e)
967 cerr << e.what() << endl;
978 const string new_display = element->GetText();
984 catch(
const logic_error& e)
986 cerr << e.what() << endl;
997 const double new_selection_error_goal = atof(element->GetText());
1003 catch(
const logic_error& e)
1005 cerr << e.what() << endl;
1016 const size_t new_maximum_iterations_number = static_cast<size_t>(atoi(element->GetText()));
1022 catch(
const logic_error& e)
1024 cerr << e.what() << endl;
1035 const double new_maximum_time = atoi(element->GetText());
1041 catch(
const logic_error& e)
1043 cerr << e.what() << endl;
1054 const double new_tolerance = atof(element->GetText());
1060 catch(
const logic_error& e)
1062 cerr << e.what() << endl;
1069 const tinyxml2::XMLElement* element = root_element->FirstChildElement(
"MaximumSelectionFailures");
1073 const size_t new_maximum_selection_failures = static_cast<size_t>(atoi(element->GetText()));
1079 catch(
const logic_error& e)
1081 cerr << e.what() << endl;
1095 document->SaveFile(file_name.c_str());
1110 if(document.LoadFile(file_name.c_str()))
1112 ostringstream buffer;
1114 buffer <<
"OpenNN Exception: IncrementalNeurons class.\n"
1115 <<
"void load(const string&) method.\n"
1116 <<
"Cannot load XML file " << file_name <<
".\n";
1118 throw logic_error(buffer.str());