From 7fe6be9ba72858a3782ae9c26d282942b596a425 Mon Sep 17 00:00:00 2001 From: Michelle Date: Thu, 9 Oct 2025 10:43:45 +0200 Subject: [PATCH] Backwards - ReLU & Dense Lasyer Made the backwards for dense layers and ReLU, but I think I soon need to refactor some code to make it all steamlined. --- bin/abc_lab | Bin 64208 -> 64384 bytes .../activation_functions/Activation_ReLU.h | 19 +++++- .../neural_networks/layers/Dense_Layer.h | 19 +++++- include/numerics/matrandom.h | 55 ++++++++++++++++++ include/numerics/numerics.h | 2 + include/numerics/vecrandom.h | 48 +++++++++++++++ include/utils/matrix.h | 1 - obj/main.d | 19 +++--- obj/main.o | Bin 86032 -> 83640 bytes src/main.cpp | 52 +++++++---------- 10 files changed, 171 insertions(+), 44 deletions(-) create mode 100644 include/numerics/matrandom.h create mode 100644 include/numerics/vecrandom.h diff --git a/bin/abc_lab b/bin/abc_lab index 1a58c2102ef8ca647c9cbb17f75e64b792b9215d..45555df79693b157a56fdc7d33b4bc8ccf166561 100755 GIT binary patch delta 26881 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 S(lB*i-Myy3U)7K5y8j=NV<3G1 delta 27993 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 bL$6kAer5pS%XUiF>jR9VFDYZM-}(OlbkN$R diff --git a/include/modules/neural_networks/activation_functions/Activation_ReLU.h b/include/modules/neural_networks/activation_functions/Activation_ReLU.h index add7906..2427503 100644 --- a/include/modules/neural_networks/activation_functions/Activation_ReLU.h +++ b/include/modules/neural_networks/activation_functions/Activation_ReLU.h @@ -11,12 +11,29 @@ namespace neural_networks{ template struct Activation_ReLU{ - //utils::Matrix inputs; + utils::Matrix _inputs; utils::Matrix outputs; + utils::Matrix dinputs; + void forward(const utils::Matrix& inputs){ + _inputs = inputs; outputs = numerics::matclip_low(inputs, T{0}); } + void backward(const utils::Matrix& dvalues){ + // Since we need to modify the original variable, + // let's make a copy of the values first + dinputs = dvalues; + + // Zero gradients where input values were negative + for (uint64_t i = 0; i < dinputs.rows(); ++i){ + for (uint64_t j = 0; j < dinputs.cols(); ++j){ + if (_inputs(i,j) <= T{0}){ + dinputs(i,j) = T{0}; + } + } + } + } }; diff --git a/include/modules/neural_networks/layers/Dense_Layer.h b/include/modules/neural_networks/layers/Dense_Layer.h index 4acc229..ecf9faa 100644 --- a/include/modules/neural_networks/layers/Dense_Layer.h +++ b/include/modules/neural_networks/layers/Dense_Layer.h @@ -12,11 +12,15 @@ namespace neural_networks{ template struct Dense_Layer{ - //utils::Matrix _inputs; + utils::Matrix _inputs; utils::Matrix weights; utils::Vector biases; utils::Matrix outputs; + utils::Matrix dweights; + utils::Vector dbiases; + utils::Matrix dinputs; + // Default Constructor Dense_Layer() = default; @@ -29,9 +33,20 @@ namespace neural_networks{ } - void forward(utils::Matrix& inputs){ + void forward(const utils::Matrix& inputs){ + _inputs = inputs; outputs = numerics::matadd(numerics::matmul_auto(inputs, weights), biases, "row"); } + + void backward(const utils::Matrix& dvalues){ + // Gradients on parameters + dweights = numerics::matmul(numerics::transpose(_inputs), dvalues); + dbiases = numerics::matsum(dvalues, "row"); + //Gradient on values + dinputs = numerics::matmul(dvalues, numerics::transpose(weights)); + + } + }; diff --git a/include/numerics/matrandom.h b/include/numerics/matrandom.h new file mode 100644 index 0000000..b64093d --- /dev/null +++ b/include/numerics/matrandom.h @@ -0,0 +1,55 @@ +#ifndef _matrandom_n_ +#define _matrandom_n_ + +#include "./utils/vector.h" +#include "./utils/matrix.h" +#include "./core/omp_config.h" + +namespace numerics{ + + template + void inplace_matrandom_add(utils::Matrix& A, const T lower, const T higher) { + + const uint64_t rows = A.rows(); + const uint64_t cols = A.cols(); + + utils::Matrix B; + B.random(rows,cols, lower, higher); + + numerics::inplace_matadd_mat(A, B); + } + + template + void inplace_matrandom_mul(utils::Matrix& A, const T lower, const T higher) { + + const uint64_t rows = A.rows(); + const uint64_t cols = A.cols(); + + utils::Matrix B; + B.random(rows,cols, lower, higher); + + for (uint64_t i = 0; i < rows; ++i){ + for (uint64_t j = 0; j < cols; ++j){ + A(i,j) *= B(i,j); + } + } + } + + + template + utils::Matrix matrandom_add(const utils::Matrix& A, const T lower, const T higher) { + + const uint64_t rows = A.rows(); + const uint64_t cols = A.cols(); + + utils::Matrix B = A; + + numerics::inplace_matadd_mat(B, lower, higher); + + return B; + } + + +} // namespace numerics + +#endif // _matrandom_n_ \ No newline at end of file diff --git a/include/numerics/numerics.h b/include/numerics/numerics.h index 27f2a10..c3135e4 100644 --- a/include/numerics/numerics.h +++ b/include/numerics/numerics.h @@ -8,6 +8,7 @@ #include "./numerics/vecmax.h" #include "./numerics/veclog.h" #include "./numerics/vecargmax.h" +#include "./numerics/vecrandom.h" #include "./numerics/initializers/eye.h" #include "./numerics/matequal.h" #include "./numerics/transpose.h" @@ -18,6 +19,7 @@ #include "./numerics/matdiv.h" #include "./numerics/matvec.h" #include "./numerics/matadd.h" +#include "./numerics/matrandom.h" #include "./numerics/matsubtract.h" #include "./numerics/matsum.h" #include "./numerics/matclip.h" diff --git a/include/numerics/vecrandom.h b/include/numerics/vecrandom.h new file mode 100644 index 0000000..75e60b5 --- /dev/null +++ b/include/numerics/vecrandom.h @@ -0,0 +1,48 @@ +#ifndef _vecrandom_n_ +#define _vecrandom_n_ + +#include "./utils/vector.h" +#include "./utils/matrix.h" +#include "./core/omp_config.h" + +namespace numerics{ + + template + void inplace_vecrandom_add(utils::Vector& a, const T lower, const T higher) { + + const uint64_t N = a.size(); + + utils::Vector b; + b.random(N, lower, higher); + + a.inplace_add(b); + } + + template + void inplace_vecrandom_mul(utils::Vector& a, const T lower, const T higher) { + + const uint64_t N = a.size(); + + utils::Vector b; + b.random(N, lower, higher); + + a.inplace_multiply(b); + + } + + + template + utils::Vector vecrandom_add(const utils::Vector& a, const T lower, const T higher) { + + const uint64_t N = a.size(); + + utils::Vector b; + inplace_vecrandom_add(b, lower, higher); + + return b; + } + + +} // namespace numerics + +#endif // _vecrandom_n_ \ No newline at end of file diff --git a/include/utils/matrix.h b/include/utils/matrix.h index 8929e72..7a41f76 100644 --- a/include/utils/matrix.h +++ b/include/utils/matrix.h @@ -23,7 +23,6 @@ namespace utils{ class Matrix{ public: Matrix() : rows_(0), cols_(0), data_() {} // Default constructor -#include // Constructor to initialize matrix with rows × cols and a fill value Matrix(uint64_t rows, uint64_t cols, const T& value = T()) : rows_(rows), cols_(cols), data_(rows * cols, value) {} diff --git a/obj/main.d b/obj/main.d index b7ed3f9..7fffdb3 100644 --- a/obj/main.d +++ b/obj/main.d @@ -7,19 +7,20 @@ obj/main.o: src/main.cpp include/./core/omp_config.h \ include/./numerics/exp.h include/./numerics/log.h \ include/./numerics/vecclip.h include/./numerics/vecexp.h \ include/./numerics/vecmax.h include/./numerics/veclog.h \ - include/./numerics/vecargmax.h include/./numerics/initializers/eye.h \ - include/./numerics/matequal.h include/./numerics/abs.h \ - include/./numerics/transpose.h include/./numerics/inverse.h \ + include/./numerics/vecargmax.h include/./numerics/vecrandom.h \ + include/./numerics/initializers/eye.h include/./numerics/matequal.h \ + include/./numerics/abs.h include/./numerics/transpose.h \ + include/./numerics/inverse.h \ include/./numerics/inverse/inverse_gauss_jordan.h \ include/./numerics/inverse/inverse_lu.h include/./decomp/lu.h \ include/./numerics/matmul.h include/./numerics/matscalar.h \ include/./numerics/matmax.h include/./numerics/matdiv.h \ include/./numerics/matvec.h include/./numerics/matadd.h \ - include/./numerics/matsubtract.h include/./numerics/matsum.h \ - include/./numerics/matclip.h include/./numerics/matexp.h \ - include/./numerics/matlog.h include/./numerics/matdot.h \ - include/./numerics/matargmax.h include/./numerics/min.h \ - include/./numerics/interpolation1d.h \ + include/./numerics/matrandom.h include/./numerics/matsubtract.h \ + include/./numerics/matsum.h include/./numerics/matclip.h \ + include/./numerics/matexp.h include/./numerics/matlog.h \ + include/./numerics/matdot.h include/./numerics/matargmax.h \ + include/./numerics/min.h include/./numerics/interpolation1d.h \ include/./numerics/interpolation1d/interpolation1d_barycentric.h \ include/./numerics/interpolation1d/interpolation1d_base.h \ include/./numerics/interpolation1d/interpolation1d_cubic_spline.h \ @@ -57,6 +58,7 @@ include/./numerics/vecexp.h: include/./numerics/vecmax.h: include/./numerics/veclog.h: include/./numerics/vecargmax.h: +include/./numerics/vecrandom.h: include/./numerics/initializers/eye.h: include/./numerics/matequal.h: include/./numerics/abs.h: @@ -71,6 +73,7 @@ include/./numerics/matmax.h: include/./numerics/matdiv.h: include/./numerics/matvec.h: include/./numerics/matadd.h: +include/./numerics/matrandom.h: include/./numerics/matsubtract.h: include/./numerics/matsum.h: include/./numerics/matclip.h: diff --git a/obj/main.o b/obj/main.o index daee6c6040189dc0248dd3c2988824172eb566dd..8511dde97341693f83b1587f40eb0de5e4b1273d 100644 GIT binary patch literal 83640 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 literal 86032 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 hNI%M-bbp4<@3GnZ@n-WC9f?;qc9M predections; @@ -53,20 +53,15 @@ int main(int argc, char const *argv[]) - for (uint64_t i = 0; i < 10000; ++i){ + for (uint64_t i = 0; i < 1000; ++i){ // Generate a new set of weights for iteration - matrRND.random(dense1.weights.rows(), dense1.weights.cols(), -1, 1); - numerics::inplace_matscalar(matrRND,0.05f); - numerics::inplace_matadd(dense1.weights, matrRND); + numerics::inplace_matrandom_mul(dense1.weights,0.98f, 1.02f); + numerics::inplace_vecrandom_mul(dense1.biases,0.98f, 1.02f); - dense1.biases.random(dense1.biases.size(), -1, 1); - - matrRND.random(dense2.weights.rows(), dense2.weights.cols(), -1, 1); - numerics::inplace_matscalar(matrRND,0.05f); - dense2.weights.random(dense2.weights.rows(), dense2.weights.cols(), -1, 1); - dense2.biases.random(dense2.biases.size(), -1, 1); + numerics::inplace_matrandom_mul(dense2.weights,0.98f, 1.02f); + numerics::inplace_vecrandom_mul(dense2.biases,0.98f, 1.02f); // Perform a forward pass of the training data through this layer dense1.forward(X); @@ -95,36 +90,29 @@ int main(int argc, char const *argv[]) best_dense_2_weights = dense2.weights; best_dense_2_biases = dense2.biases; lowest_loss = loss; + } else{ + //std::cout << "HERE" << std::endl; + dense1.weights = best_dense_1_weights; + dense1.biases = best_dense_1_biases; + dense2.weights = best_dense_2_weights; + dense2.biases = best_dense_2_biases; } } - - - - - - - for (int i = 0; i < 5; ++i){ - std::cout << activation2.outputs.get_row(i) << std::endl; - } - std::cout << loss << std::endl; - - - //predections.print(); - - - - - - //predections.print(); - //class_targets.print(); - std::cout << accuracy << std::endl; + utils::Mf dvalues{{1, 1, 1}, + {2, 2, 2}, + {3, 3, 3}}; + utils::Vf biases{2,3,0.5}; + + utils::Vf dbiases = numerics::matsum(dvalues, "row"); + + dbiases.print();