From c164d790dbe6d5cc886de0fb8ef6bd3341b285b3 Mon Sep 17 00:00:00 2001 From: Michelle Date: Tue, 7 Oct 2025 19:06:33 +0200 Subject: [PATCH] NNFS p.135 Started on the iteration, not need to rewrite matadd.h and need to make matrandom.h. --- bin/abc_lab | Bin 55704 -> 64208 bytes .../neural_networks/datasets/vertical.h | 40 +++++ .../modules/neural_networks/neural_networks.h | 1 + include/numerics/matadd.h | 160 ++++-------------- include/numerics/matargmax.h | 62 +++++++ include/numerics/matscalar.h | 32 ++++ include/numerics/numerics.h | 12 +- include/numerics/vecargmax.h | 26 +++ include/numerics/vecmean.h | 38 +++++ include/utils/matrix.h | 2 +- include/utils/vector.h | 20 ++- obj/main.d | 40 +++-- obj/main.o | Bin 66392 -> 86032 bytes src/main.cpp | 90 +++++++++- 14 files changed, 366 insertions(+), 157 deletions(-) create mode 100644 include/modules/neural_networks/datasets/vertical.h create mode 100644 include/numerics/matargmax.h create mode 100644 include/numerics/matscalar.h create mode 100644 include/numerics/vecargmax.h diff --git a/bin/abc_lab b/bin/abc_lab index fc17bdc3854eb7ce724bf96295ef71ed2eacbabe..1a58c2102ef8ca647c9cbb17f75e64b792b9215d 100755 GIT binary patch literal 64208 zcmeFa3wTu3)jvFwOdty83<{do3nPt66fr?i20;@baz-Z@1r@C|#1J4gkeJLsP`OS9 zJROgwRxE9$FKyLoTPs@e)<%<%NdhVc6h%-8h;R;338)wXGXLLipEENj1F@Iy{eRE* zJYOeI=Ip)peeJc^UTf{O&n(XKUYlgMC)>fJ9<7JFbB~!%z#JB z5nU{o^_Bt8`Y7RP;xo&9M)Aq&_&?gjXW}!q2G|NSwY=fUEpZR9| zC+!uO<<`Dv)RXue%Zb7#`i!=BBgzpk|LVtSX1vL4ueW)qFdK+I&E{>Fm6hIg#mLLb zW?WiUI@e!)Y4zwUF1=#p@T&6RBSg(C=E6T|YSQGJZJ3UF!b~*Ul9m|pXnjl@Xr?oN zW4elPv`T`&FNIyzaqlTg38^m|}0xtIRz>;=BBm;Uta zWxQK@sb_yLHp+j+70xQ|FvG~-`Gq3yL+ks++OlO)(iaFUhsBRFY``5;=+I8=TE)VuOj2g=sdlb z{A5-q%a87ywA~MoFeI@vh;#dModjOmOZ^7{KUqD`q5ku2>9%d=KAUdV`7WMAz*X1W zWdQn`@FT$I0NXjXoOT1?M0tMJ0M2^q6Y8-Q7S5VeKDV&SS5)aMEVLDRrsfyUD5)%& zRa)gMshpZWp{#sv$<(5|%1Vs1lc(H1#Wy0Wu+TTVvV4AFS;^d4zS)H(m6hd{1=knb z3U8lLRxoc4o|C8evM;YJnmeO>4jP$PT3q5T%rBf(;+t1gmNyT5DXuOmoaHa7oKaX* ze2>4h5{;rzIdhfHttzSXdFJHh-87|qDtelbFvF5?{S@D*V&8&_5>Ij7=o#gO^Gj!x z%*|s@*n<(}eqUkv%tCZzR>{O{Hf;9HKi5|}r^M*_gzP+{^CuLErik8(A)|t+w@l6k z28yezi|#6&mz{kj!evEORfX&ZIzO{K54q4f5)3rmRfJKNm6aE>{ex9QYMAN~ zIJEY(C*JNVuk@La3V&ru;k?pHpTDRqHbyJC7RORbACzT~- zB}G-36ESkp_aYzARb5RV7aFDuq7>v+s5G5S+p<*O_yniHM=VnDNtXBSl#`YMY`eN~uX&;zIn4VD%c znz=nw3#Vok=1sYxu;BVBmltyIAkfj)(G^uz7A+{8TM{K#g9yqmukiZ}Lb1|N_T@m7 zAR;jqlVZw8%`Ed*&9=}_B5pbGyqm5E1(6)8tFyDSM;IN&s7mL~@|D7>kp%0GuR2$ofRcVY4Dy9;L)m6qA&l+2k^J}*X`zLM%v zjtw+eY;w0bMWrB7LAxM&kl?)~ELBzF-Ik6x01GBf_7h@WCp&A9)E zrKeDHU4=M5cHk+^Ok;d}*Do>D0k$VhSdoZJw!fM21)HD4cu%u6n(^5py}#|9Xu61> zYWu{DD~mHxU#jg3Gyd*#cO#TyJ8H)75&4sCeSjt6)R*}PROKYwAVb-*MfLco{+u

xJ%e#7kr?wmI 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 delta 18058 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 diff --git a/include/modules/neural_networks/datasets/vertical.h b/include/modules/neural_networks/datasets/vertical.h new file mode 100644 index 0000000..a5c1dc8 --- /dev/null +++ b/include/modules/neural_networks/datasets/vertical.h @@ -0,0 +1,40 @@ +#pragma once + +#include "./core/omp_config.h" +#include "./utils/matrix.h" +#include "./utils/vector.h" +#include "./utils/random.h" + +//#include + + +namespace neural_networks{ + + template + void create_vertical_data(const uint64_t samples, const uint64_t classes, utils::Matrix& X, utils::Matrix& y) { + + const uint64_t rows = samples*classes; + uint64_t row_idx; + + + if ((rows != X.rows()) || (X.cols() != 2)){ + X.resize(samples*classes, 2); + } + if (rows != y.rows()){ + y.resize(rows, 1); + } + + for (uint64_t i = 0; i < classes; ++i){ + for (uint64_t j = 0; j < samples; ++j){ + + row_idx = (i*samples) + j; + + X(row_idx, 0) = static_cast(i)/static_cast(classes) + utils::random(TX{-0.1}, TX{0.1}); + X(row_idx, 1) = TX{0.5} + utils::random(TX{-0.5}, TX{0.5}); + y(row_idx, 0) = static_cast(i); + } + } + } + + +} // end namesoace NN \ No newline at end of file diff --git a/include/modules/neural_networks/neural_networks.h b/include/modules/neural_networks/neural_networks.h index 3db2b2b..85523ed 100644 --- a/include/modules/neural_networks/neural_networks.h +++ b/include/modules/neural_networks/neural_networks.h @@ -2,6 +2,7 @@ #pragma once #include "datasets/spiral.h" +#include "datasets/vertical.h" #include "layers/Dense_Layer.h" diff --git a/include/numerics/matadd.h b/include/numerics/matadd.h index d3890c8..624e3c3 100644 --- a/include/numerics/matadd.h +++ b/include/numerics/matadd.h @@ -7,6 +7,39 @@ namespace numerics{ + template + void inplace_matadd_mat(utils::Matrix& A, const utils::Matrix& B) { + + const uint64_t rows = A.rows(); + const uint64_t cols = A.cols(); + + if (rows != B.rows() || cols != B.cols()) { + throw std::runtime_error("inplace_matadd: dimension mismatch"); + } + + for (uint64_t i = 0; i < cols; ++i) { + for (uint64_t j = 0; j < rows; ++j) { + A(j, i) += B(j, i); + } + } + } + + template + utils::Matrix matadd_mat(const utils::Matrix& A, const utils::Matrix& B) { + + const uint64_t rows = A.rows(); + const uint64_t cols = A.cols(); + + utils::Matrix C = A; + + if (rows != B.rows() || cols != B.cols()) { + throw std::runtime_error("inplace_matadd: dimension mismatch"); + } + + inplace_matadd_mat(C, B); + return C; + } + template void inplace_matadd_colvec(utils::Matrix& A, const utils::Vector& x) { @@ -94,133 +127,6 @@ namespace numerics{ } } - - - - /* - // -------------- Collapse(2) OpenMP ---------------- - template - utils::Vector matvec_omp(const utils::Matrix& A, const utils::Vector& x) { - if (A.cols() != x.size()) { - throw std::runtime_error("matvec: dimension mismatch"); - } - - const uint64_t m = A.rows(); - const uint64_t n = A.cols(); - - utils::Vector y(m, T{0}); // <-- y has length m (rows) - - - const T* xptr = x.data(); - const T* Aptr = A.data(); // row-major: A(i,j) == Aptr[i*n + j] - - // Each row i is an independent dot product: y[i] = dot(A[i,*], x) - #pragma omp parallel for schedule(static) - for (uint64_t i = 0; i < m; ++i) { - const T* row = Aptr + i * n; // contiguous row i - T acc = T{0}; - #pragma omp simd reduction(+:acc) - for (uint64_t j = 0; j < n; ++j) { - acc += row[j] * xptr[j]; - } - y[i] = acc; - } - - return y; - } - - // -------------- Auto OpenMP ---------------- - template - utils::Vector matvec_auto(const utils::Matrix& A, - const utils::Vector& x) { - - - uint64_t work = A.rows() * A.cols(); - - bool can_parallel = omp_config::omp_parallel_allowed(); - #ifdef _OPENMP - int threads = omp_get_max_threads(); - #else - int threads = 1; - #endif - - if (can_parallel || work > static_cast(threads) * 4ull) { - return matvec_omp(A,x); - } - else{ - // Safe fallback - return matvec(A,x); - } - - } - -// ================================================= -// y = x * A (Vector–Matrix product) -// ================================================= - template - utils::Vector vecmat(const utils::Vector& x, const utils::Matrix& A) { - if (x.size() != A.rows()) { - throw std::runtime_error("vecmat: dimension mismatch"); - } - const uint64_t m = A.rows(); - const uint64_t n = A.cols(); - - utils::Vector y(n, T{0}); - - for (uint64_t j = 0; j < n; ++j) { - for (uint64_t i = 0; i < m; ++i) { - y[j] += x[i] * A(i, j); - } - } - return y; - } - - // -------------- Collapse(2) OpenMP ---------------- - template - utils::Vector vecmat_omp(const utils::Vector& x, const utils::Matrix& A) { - if (x.size() != A.rows()) { - throw std::runtime_error("vecmat: dimension mismatch"); - } - const uint64_t m = A.rows(); - const uint64_t n = A.cols(); - - utils::Vector y(n, T{0}); - #pragma omp parallel for schedule(static) - for (uint64_t j = 0; j < n; ++j) { - T acc = T{0}; - for (uint64_t i = 0; i < m; ++i) { - acc += x[i] * A(i, j); - } - y[j] = acc; - } - return y; - } - - // -------------- Auto OpenMP ---------------- - template - utils::Vector vecmat_auto(const utils::Vector& x, - const utils::Matrix& A) { - - uint64_t work = A.rows() * A.cols(); - - bool can_parallel = omp_config::omp_parallel_allowed(); - #ifdef _OPENMP - int threads = omp_get_max_threads(); - #else - int threads = 1; - #endif - - if (can_parallel || work > static_cast(threads) * 4ull) { - return vecmat_omp(x,A); - } - else{ - // Safe fallback - return vecmat(x,A); - } - - } -*/ - } // namespace numerics #endif // _matadd_n_ \ No newline at end of file diff --git a/include/numerics/matargmax.h b/include/numerics/matargmax.h new file mode 100644 index 0000000..7fd411f --- /dev/null +++ b/include/numerics/matargmax.h @@ -0,0 +1,62 @@ +#pragma once + +#include "./utils/matrix.h" + +namespace numerics{ + + template + void inplace_matargmax_row(const utils::Matrix& A, utils::Vector& b){ + + if (b.size() != A.rows()){ + b.resize(A.rows(), Ti{0}); + } + Td value; + + for (uint64_t i = 0; i < A.rows(); ++i){ + value = Td{0}; + for (uint64_t j = 0; j < A.cols(); ++j){ + if (value < A(i,j)){ + value = A(i,j); + b[i] = j; + } + } + } + } + + template + void inplace_matargmax_col(const utils::Matrix& A, utils::Vector& b){ + + if (b.size() != A.cols()){ + b(A.cols(), Ti{0}); + } + Td value; + + for (uint64_t j = 0; j < A.cols(); ++j){ + value = Td{0}; + for (uint64_t i = 0; i < A.cols(); ++i){ + if (value < A(i,j)){ + value = A(i,j); + b[j] = i; + } + } + } + } + + template + utils::Vector matargmax_row(const utils::Matrix& A){ + utils::Vector b(A.rows(), Ti{0}); + inplace_matargmax_row(A, b); + return b; + + } + + template + utils::Vector matargmax_col(const utils::Matrix& A){ + utils::Vector b(A.rows(), Ti{0}); + inplace_matargmax_col(A, b); + return b; + + } + +} // namespace numerics + diff --git a/include/numerics/matscalar.h b/include/numerics/matscalar.h new file mode 100644 index 0000000..a4c2dfb --- /dev/null +++ b/include/numerics/matscalar.h @@ -0,0 +1,32 @@ +#pragma once + +#include "./utils/matrix.h" + +namespace numerics{ + + template + void inplace_matscalar(utils::Matrix& A, const T scalar){ + + const uint64_t rows = A.rows(); + const uint64_t cols = A.cols(); + + for (uint64_t i = 0; i < rows; ++i){ + for (uint64_t j = 0; j < cols; ++j){ + A(i,j) *= scalar; + } + } + } + + template + utils::Matrix matscalar(const utils::Matrix& A, T scalar){ + + utils::Matrix B = A; + inplace_matscalar(B, scalar); + return B; + + } + + + +} // namespace numerics + diff --git a/include/numerics/numerics.h b/include/numerics/numerics.h index d048dab..27f2a10 100644 --- a/include/numerics/numerics.h +++ b/include/numerics/numerics.h @@ -3,11 +3,17 @@ #include "./numerics/max.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/transpose.h" #include "./numerics/inverse.h" #include "./numerics/matmul.h" +#include "./numerics/matscalar.h" #include "./numerics/matmax.h" #include "./numerics/matdiv.h" #include "./numerics/matvec.h" @@ -18,12 +24,10 @@ #include "./numerics/matexp.h" #include "./numerics/matlog.h" #include "./numerics/matdot.h" +#include "./numerics/matargmax.h" #include "./numerics/min.h" #include "./numerics/abs.h" -#include "./numerics/vecclip.h" -#include "./numerics/vecexp.h" -#include "./numerics/vecmax.h" -#include "./numerics/veclog.h" + #include "./numerics/interpolation1d.h" // base diff --git a/include/numerics/vecargmax.h b/include/numerics/vecargmax.h new file mode 100644 index 0000000..f61b99d --- /dev/null +++ b/include/numerics/vecargmax.h @@ -0,0 +1,26 @@ +#pragma once + +#include "./utils/vector.h" + +namespace numerics{ + + template + T vecarmax(const utils::Vector& a){ + + const uint64_t N = a.size(); + uint64_t idx = 0; + T value; + + for (uint64_t i = 0; i < N; ++i){ + if (value > a[i]){ + value = a[i]; + idx = i; + + } + } + return idx; + } + + +} // namespace numerics + diff --git a/include/numerics/vecmean.h b/include/numerics/vecmean.h index 268b5aa..65b0b7a 100644 --- a/include/numerics/vecmean.h +++ b/include/numerics/vecmean.h @@ -22,6 +22,44 @@ namespace numerics{ return mean; } + template + T vecmean_isequal(utils::Vector& a, utils::Vector& b, T tol=1e-12) { + + uint64_t count = T{0}; + + const uint64_t N = a.size(); + + if (a.size() != b.size()){ + throw std::runtime_error("vecmean_equal: dimension mismatch"); + } + + + for (uint64_t i = 0; i < N; ++i) { + if ((a[i]-b[i]) < tol){ + count += 1; + } + } + return static_cast(count)/static_cast(N); + } + template + Td vecmean_equal(utils::Vector& a, utils::Vector& b) { + + Ti count = Ti{0}; + + const uint64_t N = a.size(); + + if (a.size() != b.size()){ + throw std::runtime_error("vecmean_equal: dimension mismatch"); + } + + + for (uint64_t i = 0; i < N; ++i) { + if (a[i]==b[i]){ + count += Ti{1}; + } + } + return static_cast(count)/static_cast(N); + } } // namespace numerics diff --git a/include/utils/matrix.h b/include/utils/matrix.h index c13cb3d..8929e72 100644 --- a/include/utils/matrix.h +++ b/include/utils/matrix.h @@ -23,7 +23,7 @@ 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/include/utils/vector.h b/include/utils/vector.h index 5780b19..03c03ce 100644 --- a/include/utils/vector.h +++ b/include/utils/vector.h @@ -7,7 +7,7 @@ #include - +#include "./utils/random.h" #include #include #include @@ -38,6 +38,24 @@ public: + + + void random(const uint64_t size, const T& lower, const T& higher){ + + v.resize(size, T{0}); + + // Copy data row by row + for (uint64_t i = 0; i < size; ++i) { + v[i] = utils::random(lower, higher); + } + + } + + + + + + //########################################################## //# VECTOR: --- basic properties --- # //########################################################## diff --git a/obj/main.d b/obj/main.d index de6b5cc..b7ed3f9 100644 --- a/obj/main.d +++ b/obj/main.d @@ -1,23 +1,24 @@ obj/main.o: src/main.cpp include/./core/omp_config.h \ include/./utils/utils.h include/./utils/vector.h \ - include/./utils/matrix.h include/./utils/random.h \ + include/./utils/random.h include/./utils/matrix.h \ include/./utils/generators.h include/./utils/generators/linspace.h \ include/utils/vector.h include/./utils/matcast.h \ include/./numerics/numerics.h include/./numerics/max.h \ include/./numerics/exp.h include/./numerics/log.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/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/min.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/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/interpolation1d/interpolation1d_barycentric.h \ include/./numerics/interpolation1d/interpolation1d_base.h \ @@ -31,6 +32,7 @@ obj/main.o: src/main.cpp include/./core/omp_config.h \ include/utils/matrix.h \ include/./modules/neural_networks/neural_networks.h \ include/./modules/neural_networks/datasets/spiral.h \ + include/./modules/neural_networks/datasets/vertical.h \ include/./modules/neural_networks/layers/Dense_Layer.h \ include/./modules/neural_networks/activation_functions/Activation_ReLU.h \ include/./modules/neural_networks/activation_functions/Activation_Softmax.h \ @@ -40,8 +42,8 @@ obj/main.o: src/main.cpp include/./core/omp_config.h \ include/./core/omp_config.h: include/./utils/utils.h: include/./utils/vector.h: -include/./utils/matrix.h: include/./utils/random.h: +include/./utils/matrix.h: include/./utils/generators.h: include/./utils/generators/linspace.h: include/utils/vector.h: @@ -50,6 +52,11 @@ include/./numerics/numerics.h: include/./numerics/max.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: @@ -59,6 +66,7 @@ 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: @@ -69,11 +77,8 @@ 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/vecclip.h: -include/./numerics/vecexp.h: -include/./numerics/vecmax.h: -include/./numerics/veclog.h: include/./numerics/interpolation1d.h: include/./numerics/interpolation1d/interpolation1d_barycentric.h: include/./numerics/interpolation1d/interpolation1d_base.h: @@ -90,6 +95,7 @@ include/core/global_config.h: include/utils/matrix.h: include/./modules/neural_networks/neural_networks.h: include/./modules/neural_networks/datasets/spiral.h: +include/./modules/neural_networks/datasets/vertical.h: include/./modules/neural_networks/layers/Dense_Layer.h: include/./modules/neural_networks/activation_functions/Activation_ReLU.h: include/./modules/neural_networks/activation_functions/Activation_Softmax.h: diff --git a/obj/main.o b/obj/main.o index 4ff8bcbb83f0a16844ecd44fa67ac73d4144ed3b..daee6c6040189dc0248dd3c2988824172eb566dd 100644 GIT binary patch literal 86032 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
  • d?@odj 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%0D;; zjh0{Ktuzu0skcqMX%&X z5I&hId8 MuSEHHFw6h{09h2hm;e9( diff --git a/src/main.cpp b/src/main.cpp index 1fcda2f..1ac4389 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,31 +25,107 @@ int main(int argc, char const *argv[]) utils::Mf X(10,2, 0); utils::Matrix y(10,1, 0); - neural_networks::create_spital_data(100, 3, X, y); + utils::Vector class_targets; + float loss; + float accuracy; + + //neural_networks::create_spital_data(10000, 3, X, y); + neural_networks::create_vertical_data(100, 3, X, y); neural_networks::Dense_Layer dense1(2, 3); - neural_networks::Activation_ReLU activation1; neural_networks::Dense_Layer dense2(3, 3); neural_networks::Activation_Softmax activation2; neural_networks::Loss_CategoricalCrossentrophy loss_funtion; - dense1.forward(X); - activation1.forward(dense1.outputs); - dense2.forward(activation1.outputs); - activation2.forward(dense2.outputs); + float lowest_loss = 9999999; + utils::Mf best_dense_1_weights = dense1.weights; + utils::Vf best_dense_1_biases = dense1.biases; + utils::Mf best_dense_2_weights = dense2.weights; + utils::Vf best_dense_2_biases = dense2.biases; + utils::Mf matrRND; + utils::Vf vectRND; + + utils::Vector predections; + + + + + + for (uint64_t i = 0; i < 10000; ++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); + + 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); + + // Perform a forward pass of the training data through this layer + dense1.forward(X); + activation1.forward(dense1.outputs); + dense2.forward(activation1.outputs); + activation2.forward(dense2.outputs); + + // Perform a farward pass through activation function + // it takes the output of the second dense layer here and returns loss + loss = loss_funtion.calculate(activation2.outputs, y); + + predections = numerics::matargmax_row(activation2.outputs); + + if (y.cols() < 1){ + class_targets = numerics::matargmax_row(y); + }else{ + class_targets = y.get_col(0); + } + + accuracy = numerics::vecmean_equal(predections, class_targets); + + if (loss < lowest_loss){ + std::cout << "New set of weights found, iteration:" << i << ", loss:" << loss << ", acc:" << accuracy << std::endl; + best_dense_1_weights = dense1.weights; + best_dense_1_biases = dense1.biases; + best_dense_2_weights = dense2.weights; + best_dense_2_biases = dense2.biases; + lowest_loss = loss; + } + + + } + + + + + + + for (int i = 0; i < 5; ++i){ std::cout << activation2.outputs.get_row(i) << std::endl; } - float loss = loss_funtion.calculate(activation2.outputs, y); std::cout << loss << std::endl; + + //predections.print(); + + + //predections.print(); + //class_targets.print(); + + std::cout << accuracy << std::endl; + +