From 72f2688c7d7241c63c7b83664601da62e8b6c44f Mon Sep 17 00:00:00 2001 From: rluna Date: Fri, 4 Jan 2019 17:47:13 +0100 Subject: [PATCH] finished of correcting "int" to "size_t" to avoid nasty errors and implement a test for SetWeights() function --- data/iris.mlp | Bin 421 -> 469 bytes src/Layer.h | 13 ++++++------- src/MLP.cpp | 2 ++ src/MLP.h | 9 ++++----- src/MLPTest.cpp | 25 +++++++++++++------------ src/Node.h | 5 ++--- src/Utils.h | 3 ++- 7 files changed, 29 insertions(+), 28 deletions(-) diff --git a/data/iris.mlp b/data/iris.mlp index 77badc2da12721a0e5660b9a588e5d83d871a918..dce3f72e12d1303cfd068e5e64babd6bd7990f89 100644 GIT binary patch literal 469 zcmZQ&fB4eQ<*9=LDIGxx5P^a0JQpKsm_|GfX6 zdE@#eTT~ph`Msrg+bLt%_w(q3vM0`;?1Pict-n5fY+p5{EMG>0$>9U1#$KBzd}wc>VC){tpx74xp>w{MqAY@C;#x dcd^W^Z&nH)@T-i@vuKiVIPW`!wc^~L{QxCriB13j literal 421 zcmZQ&U|?VdVn!fl1!53jfly#^7#}3Z4izuXOwY~FOo1r}iSF9@?LyGy=ldTthtJkL z_tm~O_W94*dFSoF=$t!RAN9`u(~RJGsasFmBkP%MnW@&oWqIJNx=EyX{k*>*rJ(3~Gi2VRCH z%2!Ff-;b>Jw`e$TiyF&;l*4sw=Y+TqI3= #include #include @@ -16,6 +13,8 @@ #include #include #include // for assert() +#include "Node.h" +#include "Utils.h" class Layer { public: @@ -82,7 +81,7 @@ public: output->resize(m_num_nodes); - for (int i = 0; i < m_num_nodes; ++i) { + for (size_t i = 0; i < m_num_nodes; ++i) { m_nodes[i].GetOutputAfterActivationFunction(input, m_activation_function, &((*output)[i])); @@ -111,7 +110,7 @@ public: dE_doj = deriv_error[i]; doj_dnetj = m_deriv_activation_function(net_sum); - for (int j = 0; j < m_num_inputs_per_node; j++) { + for (size_t j = 0; j < m_num_inputs_per_node; j++) { (*deltas)[j] += dE_doj * doj_dnetj * m_nodes[i].GetWeights()[j]; dnetj_dwij = input_layer_activation[j]; @@ -180,8 +179,8 @@ public: }; protected: - int m_num_inputs_per_node{ 0 }; - int m_num_nodes{ 0 }; + size_t m_num_inputs_per_node{ 0 }; + size_t m_num_nodes{ 0 }; std::vector m_nodes; std::string m_activation_function_str; diff --git a/src/MLP.cpp b/src/MLP.cpp index ca54320..4770edc 100644 --- a/src/MLP.cpp +++ b/src/MLP.cpp @@ -3,6 +3,7 @@ // Author : David Nogueira //============================================================================ #include "MLP.h" + #include #include #include @@ -10,6 +11,7 @@ #include #include #include + #include "easylogging++.h" diff --git a/src/MLP.h b/src/MLP.h index 2a1cc5e..551f0fe 100644 --- a/src/MLP.h +++ b/src/MLP.h @@ -5,10 +5,6 @@ #ifndef MLP_H #define MLP_H -#include "Layer.h" -#include "Sample.h" -#include "Utils.h" - #include #include #include @@ -17,6 +13,9 @@ #include #include #include +#include "Layer.h" +#include "Sample.h" +#include "Utils.h" class MLP { public: @@ -54,7 +53,7 @@ private: const std::vector & layers_activfuncs, bool use_constant_weight_init, double constant_weight_init = 0.5); - int m_num_inputs{ 0 }; + size_t m_num_inputs{ 0 }; int m_num_outputs{ 0 }; int m_num_hidden_layers{ 0 }; std::vector m_layers_nodes; diff --git a/src/MLPTest.cpp b/src/MLPTest.cpp index ad237f7..3fb0c07 100644 --- a/src/MLPTest.cpp +++ b/src/MLPTest.cpp @@ -347,6 +347,17 @@ UNIT(GetWeightsSetWeights) { // get layer weights std::vector> weights = my_mlp.GetLayerWeights( 1 ); + for (const auto & training_sample : training_sample_set_with_bias) { + std::vector output; + my_mlp.GetOutput(training_sample.input_vector(), &output); + for (size_t i = 0; i < num_outputs; i++) { + bool predicted_output = output[i] > 0.5 ? true : false; + std::cout << "PREDICTED OUTPUT IS NOW: " << output[i] << std::endl; + bool correct_output = training_sample.output_vector()[i] > 0.5 ? true : false; + ASSERT_TRUE(predicted_output == correct_output); + } + } + // the expected value of the internal weights // after training are 1.65693 -0.538749 ASSERT_TRUE( 1.6 <= weights[0][0] && weights[0][0] <= 1.7 ); @@ -358,24 +369,14 @@ UNIT(GetWeightsSetWeights) { my_mlp.SetLayerWeights( 1, zeroWeights ); - /* - * - * PREDICTED OUTPUT IS NOW: 0.335394 -PREDICTED OUTPUT IS NOW: 1.13887 -PREDICTED OUTPUT IS NOW: 0.180468 -PREDICTED OUTPUT IS NOW: 1.00535 - * - */ for (const auto & training_sample : training_sample_set_with_bias) { std::vector output; my_mlp.GetOutput(training_sample.input_vector(), &output); for (size_t i = 0; i < num_outputs; i++) { - bool predicted_output = output[i] > 0.5 ? true : false; - std::cout << "PREDICTED OUTPUT IS NOW: " << output[i] << std::endl; - bool correct_output = training_sample.output_vector()[i] > 0.5 ? true : false; - ASSERT_TRUE(predicted_output == correct_output); + ASSERT_TRUE( -0.0001L <= output[i] && output[i] <= 0.0001L ); } } + LOG(INFO) << "Trained with success." << std::endl; } diff --git a/src/Node.h b/src/Node.h index d145d51..2fea944 100644 --- a/src/Node.h +++ b/src/Node.h @@ -5,8 +5,6 @@ #ifndef NODE_H #define NODE_H -#include "Utils.h" - #include #include #include @@ -16,6 +14,7 @@ #include #include // for assert() #include +#include "Utils.h" #define CONSTANT_WEIGHT_INITIALIZATION 0 @@ -150,7 +149,7 @@ public: }; protected: - int m_num_inputs{ 0 }; + size_t m_num_inputs{ 0 }; double m_bias{ 0.0 }; std::vector m_weights; }; diff --git a/src/Utils.h b/src/Utils.h index 9a8eb30..229d04b 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -5,7 +5,6 @@ #ifndef UTILS_H #define UTILS_H -#include "Chrono.h" #include #include #include @@ -22,6 +21,8 @@ #include #include #include + +#include "Chrono.h" #ifdef _WIN32 #include #else