From 22d6ea5fade8c9ca1ffc9571f093e23e6de9869d Mon Sep 17 00:00:00 2001 From: Michelle Date: Mon, 20 Oct 2025 14:23:36 +0200 Subject: [PATCH] Backwards Pass Activation Softmax with CategoricalCrossentrophy is almost done from page. 234 --- bin/abc_lab | Bin 64384 -> 68704 bytes .../activation_functions/Activation_Softmax.h | 35 ++++++-- ...ion_Softmax_Loss_CategoricalCrossentropy.h | 68 +++++++++++++++ include/modules/neural_networks/loss/Loss.h | 2 + .../loss/Loss_CategoricalCrossentrophy.h | 79 ++++++++++++------ .../modules/neural_networks/neural_networks.h | 1 + include/numerics/matdiv.h | 55 +++++++++++- include/utils/generators.h | 1 + include/utils/generators/eye.h | 24 ++++++ obj/main.d | 19 +++-- obj/main.o | Bin 83640 -> 88992 bytes src/main.cpp | 14 ++-- 12 files changed, 248 insertions(+), 50 deletions(-) create mode 100644 include/modules/neural_networks/activation_functions/Activation_Softmax_Loss_CategoricalCrossentropy.h create mode 100644 include/utils/generators/eye.h diff --git a/bin/abc_lab b/bin/abc_lab index 45555df79693b157a56fdc7d33b4bc8ccf166561..12233533d47348a18c2efff55c871d9d26c11b82 100755 GIT binary patch literal 68704 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�BAFh$@h8xJ9pBNEts{tB-s#4F;;f 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 literal 64384 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%0ARY5_ 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

agTW%xexfft<|M>W%>0uErh>ZbAQ zH0oXxiDk2()EYZAaMJw5Wf6`xtsY(U;Ynu$b8}V}Js#5xRcAB)d^z{1%EZv+yJ!?C zrQg|oIVCe=?YkAqYmRq%PR+~L>u%}Mhua-~DV`rL<0PxY66W@Km&u@~QL|YzvD6+E z`kXWSj1(~ytN3mVkrmfHcUYnU2jlQ~BI7b7?Sa|7>1K^d04DE$;6@-4VHN2Aq;hD zToLPODp8pXs2ny)JtYX&XcOIr7>>f}dTO-+gj^}P>j$9Zk+SYiwSjG|Q zIj!W~Mh?$S^8_rC&TtrkJ)ik%)x0)YyK~*4ZJrh$ULEC(J>IbKc*Aphr~WVivsdc_ z=TywuH}Ji*G?~SG8?ao|aMawTbNF0T5J8+&w}bG!LHe$SUuBqdpoYfMnbZ~O6r-?G zyn;SuD)P}pX;cJLlQ~qOVY#TEjAKE9gX&co3(v5^Ne~0y6*6Ukv-Fq@25}o4$@5Lg zPKqEV%gCyUez2HVA3%ckD1Uq!O`$ZCLp8}HuV{IIQl;weQo0OtPvwvpC{l@>$fi-3 zE*(x^;1gRGKYCHtA9>%y6+1VAK8f>Zbg`883k{^W7iZ$n=M~h4a7TNRhQFQp4GdK% z^^Mu@F=+fORTcjz^BeeKL&%V~(<<057r%+;F)&b})HiN^3S&8e*fJyk4A*a9GxK8` zUnRHv31G3MSb2XFpJyPQ=AuM8BHbB&^Zh*y993!RpJf6AO?)3nRC4S88el1Q&hVRf zIRkmyQW*ISoq@FNNU?Y(Z{qO`EO3P+KSC=i^5a&eTX3aUH2fw$&_EL(XzF*r|CgA5 zwJHs96uj9{f!rR%Pcf8k{yTsp5l#6bfDEO8y3)>MRdTogSMk)z9|&l21J!Q;I7%@4 zUk2Xo;-6lji48P#rU;WaaK^>IpZN{kVHC>+7(N5P@8UOcVg}CV{ULY#CjYRD-^4c< zi0$L5|hb#o#BIjF@Jh{}}TZOvMaMy#{>|n5pj=eiOGg_zO)D;)bREPs#8b`};O< z&iYM!@t!9YxtO4bj%4@^ycEx!{9=}gpVrX$NmGR3Gx^KGOgJNd=d6CRl=(NTG?W^4 zR%bkql`hW~OGo@AxugcaM@kJNPo*Wb<^=n`Nlw#>+H-V5P971 struct Activation_Softmax{ - utils::Matrix exp_values; - utils::Matrix probabilities; + //utils::Matrix exp_values; + //utils::Matrix probabilities; utils::Matrix outputs; + utils::Matrix dinputs; + void forward(const utils::Matrix& inputs){ // Get unnormalized probabilities - exp_values = numerics::matexp(numerics::matsubtract(inputs, numerics::matmax(inputs, "rows"), "col")); + utils::Matrix exp_values = numerics::matexp(numerics::matsubtract(inputs, numerics::matmax(inputs, "rows"), "col")); // Normalize them for each sample - probabilities = numerics::matdiv(exp_values, numerics::matsum(exp_values, "col"), "col"); - - + utils::Matrix probabilities = numerics::matdiv(exp_values, numerics::matsum(exp_values, "col"), "col"); outputs = probabilities; - } + void backward(const utils::Matrix& dvalues){ + + const uint64_t rows = dvalues.rows(); + const uint64_t cols = dvalues.cols(); + + if ((dinputs.rows() != rows) || dinputs.cols() != cols){ + dinputs.resize(rows, cols); + } + + for (uint64_t i = 0; i < rows; ++i){ + T dot = T{0}; + for (uint64_t j = 0; j < cols; ++j){ + dot += outputs(i,j) * dvalues(i,j); + } + for (uint64_t j = 0; j < cols; ++j){ + dinputs(i,j) = outputs(i,j) * (dvalues(i,j) - dot); + } + } + } }; - - } // end namespace neural_networks \ No newline at end of file diff --git a/include/modules/neural_networks/activation_functions/Activation_Softmax_Loss_CategoricalCrossentropy.h b/include/modules/neural_networks/activation_functions/Activation_Softmax_Loss_CategoricalCrossentropy.h new file mode 100644 index 0000000..8816960 --- /dev/null +++ b/include/modules/neural_networks/activation_functions/Activation_Softmax_Loss_CategoricalCrossentropy.h @@ -0,0 +1,68 @@ +#pragma once + +#include "./core/omp_config.h" + +#include "./utils/vector.h" +#include "./utils/matrix.h" + +#include "./numerics/matmax.h" +#include "./numerics/matsubtract.h" +#include "./numerics/matexp.h" +#include "./numerics/matdiv.h" + +#include "./modules/neural_networks/activation_functions/Activation_Softmax.h" +#include "./modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h" + + +namespace neural_networks{ + + template + struct Activation_Softmax_Loss_CategoricalCrossentropy{ + + neural_networks::Activation_Softmax activation; + neural_networks::Loss_CategoricalCrossentrophy loss; + + //utils::Matrix exp_values; + //utils::Matrix probabilities; + utils::Matrix outputs; + utils::Matrix dinputs; + + utils::Vector forward(const utils::Matrix& inputs, const utils::Matrix& y_true){ + + // Output layer's activation function + activation.forward(inputs); + // Set the output + outputs = activation.outputs; + // Calculate and return loss value + Td data_loss = loss.calculate(inputs, y_true); + return data_loss; + } + + void backward(const utils::Matrix& dvalues, const utils::Matrix& y_true){ + + // Number of samples + const uint64_t samples = y_true.rows(); + + // If the labels are one-hot encoded, + // turn them into discrete values + + const uint64_t rows = dvalues.rows(); + const uint64_t cols = dvalues.cols(); + + if ((dinputs.rows() != rows) || dinputs.cols() != cols){ + dinputs.resize(rows, cols); + } + + for (uint64_t i = 0; i < rows; ++i){ + Td dot = Td{0}; + for (uint64_t j = 0; j < cols; ++j){ + dot += outputs(i,j) * dvalues(i,j); + } + for (uint64_t j = 0; j < cols; ++j){ + dinputs(i,j) = outputs(i,j) * (dvalues(i,j) - dot); + } + } + } + }; + +} // end namespace neural_networks \ No newline at end of file diff --git a/include/modules/neural_networks/loss/Loss.h b/include/modules/neural_networks/loss/Loss.h index 5b3b634..5f72a35 100644 --- a/include/modules/neural_networks/loss/Loss.h +++ b/include/modules/neural_networks/loss/Loss.h @@ -13,9 +13,11 @@ namespace neural_networks{ struct Loss{ utils::Vector sample_losses; + utils::Matrix dinputs; Td data_loss; virtual utils::Vector forward(const utils::Matrix& output, const utils::Matrix& y) = 0; + virtual void backward(const utils::Matrix& dvalues, const utils::Matrix& y) = 0; Td calculate(const utils::Matrix& output, const utils::Matrix& y){ diff --git a/include/modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h b/include/modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h index 33f07ea..94c9a0d 100644 --- a/include/modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h +++ b/include/modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h @@ -16,38 +16,67 @@ namespace neural_networks{ template struct Loss_CategoricalCrossentrophy : Loss { - - utils::Vector forward(const utils::Matrix& y_pred, const utils::Matrix& y_true) override{ - - utils::Vector correct_confidences(y_true.rows(), Td{0}); - utils::Matrix cast_y_true = utils::matcast(y_true); - // Number of samles in a batch - const uint64_t samples = y_true.rows(); + utils::Matrix dinputs; - // Clip data to prevent dividning by 0 - // Clip both sides to not drag mean towards any value - utils::Matrix y_pred_clipped = numerics::matclip(y_pred, Td{1e-7}, Td{1.0} - Td{1e-7}); + + utils::Vector forward(const utils::Matrix& y_pred, const utils::Matrix& y_true) override{ + + utils::Vector correct_confidences(y_true.rows(), Td{0}); + utils::Matrix cast_y_true = utils::matcast(y_true); - // Probabilities for taget values - // only if categorical labes - if (y_true.cols() == 1){ - for (uint64_t i = 0; i < y_true.rows(); ++i){ - const uint64_t idx = static_cast(y_true(i, 0)); - correct_confidences[i] = y_pred_clipped(i, idx); - } - }else{ // Mask values - only for one-hot encoded labels - correct_confidences = numerics::matdot_row(y_pred_clipped, cast_y_true); + // Number of samles in a batch + const uint64_t samples = y_true.rows(); + // Clip data to prevent dividning by 0 + // Clip both sides to not drag mean towards any value + utils::Matrix y_pred_clipped = numerics::matclip(y_pred, Td{1e-7}, Td{1.0} - Td{1e-7}); + + // Probabilities for taget values + // only if categorical labes + if (y_true.cols() == 1){ + for (uint64_t i = 0; i < y_true.rows(); ++i){ + const uint64_t idx = static_cast(y_true(i, 0)); + correct_confidences[i] = y_pred_clipped(i, idx); } - // Losses - utils::Vector negative_log_likelihoods(samples, Td{0}); - for (uint64_t i = 0; i < samples; ++i){ - negative_log_likelihoods[i] = -std::log(static_cast(correct_confidences[i])); - } + }else{ // Mask values - only for one-hot encoded labels + correct_confidences = numerics::matdot_row(y_pred_clipped, cast_y_true); - return negative_log_likelihoods; } + // Losses + utils::Vector negative_log_likelihoods(samples, Td{0}); + for (uint64_t i = 0; i < samples; ++i){ + negative_log_likelihoods[i] = -std::log(static_cast(correct_confidences[i])); + } + + return negative_log_likelihoods; + } + + void backward(const utils::Matrix& dvalues, const utils::Matrix& y_true) override{ + + // Number of samples + const Td samples = static_cast (y_true.rows()); + // Number of labels in every sample + // We'll use the first samle to count them + const Ti labels = dvalues.cols(); + + utils::Matrix y_temp; + + if (y_true.cols() == 1){ + + y_temp = utils::eye(labels, y_true.get_col(0)); + }else{ + y_temp = y_true; + } + + + // Calculate the gradient + numerics::inplace_matscalar(y_temp,Ti{-1}); + dinputs = numerics::matdiv(utils::matcast(y_temp), dvalues); + numerics::inplace_matdiv(dinputs, samples); + + + } }; diff --git a/include/modules/neural_networks/neural_networks.h b/include/modules/neural_networks/neural_networks.h index 85523ed..4260399 100644 --- a/include/modules/neural_networks/neural_networks.h +++ b/include/modules/neural_networks/neural_networks.h @@ -9,6 +9,7 @@ #include "activation_functions/Activation_ReLU.h" #include "activation_functions/Activation_Softmax.h" +#include "activation_functions/Activation_Softmax_Loss_CategoricalCrossentropy.h" #include "loss/Loss.h" // Base #include "loss/Loss_CategoricalCrossentrophy.h" diff --git a/include/numerics/matdiv.h b/include/numerics/matdiv.h index c8e1312..c4c175e 100644 --- a/include/numerics/matdiv.h +++ b/include/numerics/matdiv.h @@ -8,7 +8,6 @@ namespace numerics{ -// ---------------- Serial baseline ---------------- template utils::Matrix matdiv(const utils::Matrix& A, const utils::Vector& b, std::string method){ @@ -33,6 +32,60 @@ namespace numerics{ } + + + template + void inplace_matdiv(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_matdiv: rows and cols are not the same'"); + } + + 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 matdiv(const 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("matdiv: choose div by: 'row' or 'col'"); + } + + utils::Matrix C = A; + + inplace_matdiv(C, B); + + return C; + } + + template + void inplace_matdiv(utils::Matrix& A, const T b){ + + 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) /= b; + } + } + } + + + + } // namespace numerics #endif // _matdiv_n_ \ No newline at end of file diff --git a/include/utils/generators.h b/include/utils/generators.h index 3369d29..e1b8ae8 100644 --- a/include/utils/generators.h +++ b/include/utils/generators.h @@ -2,3 +2,4 @@ #pragma once #include "./utils/generators/linspace.h" +#include "./utils/generators/eye.h" diff --git a/include/utils/generators/eye.h b/include/utils/generators/eye.h new file mode 100644 index 0000000..dbe3227 --- /dev/null +++ b/include/utils/generators/eye.h @@ -0,0 +1,24 @@ +#pragma once + +#include "utils/vector.h" +#include "utils/matrix.h" + + +namespace utils{ + + template + utils::Matrix eye(const T a, const utils::Vector& b){ + + const uint64_t N = b.size(); + utils::Matrix C(N, a, T{0}); + + for (uint64_t i = 0; i < N; ++i){ + C(i, b[i]) = T{1}; + } + return C; + } + + + + +} // end namespace utils \ No newline at end of file diff --git a/obj/main.d b/obj/main.d index 7fffdb3..941cdc8 100644 --- a/obj/main.d +++ b/obj/main.d @@ -2,7 +2,8 @@ obj/main.o: src/main.cpp include/./core/omp_config.h \ include/./utils/utils.h include/./utils/vector.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/utils/vector.h include/./utils/generators/eye.h \ + include/utils/matrix.h include/./utils/matcast.h \ include/./numerics/numerics.h include/./numerics/max.h \ include/./numerics/exp.h include/./numerics/log.h \ include/./numerics/vecclip.h include/./numerics/vecexp.h \ @@ -30,16 +31,16 @@ obj/main.o: src/main.cpp include/./core/omp_config.h \ include/./decomp/decomp.h include/./modules/mesh/mesh.h \ include/modules/mesh/mesh1d.h include/modules/fluids/fluids.h \ include/modules/fluids/diffusion1d.h 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 \ - include/./modules/neural_networks/loss/Loss.h \ - include/./numerics/vecmean.h \ - include/./modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h + include/./modules/neural_networks/activation_functions/Activation_Softmax_Loss_CategoricalCrossentropy.h \ + include/./modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h \ + include/./modules/neural_networks/loss/./Loss.h \ + include/./numerics/vecmean.h include/./core/omp_config.h: include/./utils/utils.h: include/./utils/vector.h: @@ -48,6 +49,8 @@ include/./utils/matrix.h: include/./utils/generators.h: include/./utils/generators/linspace.h: include/utils/vector.h: +include/./utils/generators/eye.h: +include/utils/matrix.h: include/./utils/matcast.h: include/./numerics/numerics.h: include/./numerics/max.h: @@ -95,13 +98,13 @@ include/modules/mesh/mesh1d.h: include/modules/fluids/fluids.h: include/modules/fluids/diffusion1d.h: 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: -include/./modules/neural_networks/loss/Loss.h: -include/./numerics/vecmean.h: +include/./modules/neural_networks/activation_functions/Activation_Softmax_Loss_CategoricalCrossentropy.h: include/./modules/neural_networks/loss/Loss_CategoricalCrossentrophy.h: +include/./modules/neural_networks/loss/./Loss.h: +include/./numerics/vecmean.h: diff --git a/obj/main.o b/obj/main.o index 8511dde97341693f83b1587f40eb0de5e4b1273d..93e67495a9cf95fce6c5477ccbf1e96390e01616 100644 GIT binary patch literal 88992 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

@P$cK`wC z)c(jM9H2JjA-0+yAN__xq+<8`fefIisds5JP-0ioCnE0)V{7Qen(7m>{A^rS^+jX2MrbH4T5%f zP7zPLi*K{R78{gD{8)Cg&c^7GFcY8fa63a_mNN|u+R1O@fI;sHz9R=aDuMguph|o{ zG=S~8cwt8U2f=~J6m&Y$Jn6zv?GLQf|i>f~tSQI|LZSmY+A<{7z2 zjWhAUgJ3~OwZFH`VkLZtpPb(=K&%yM#tod@LZb%zF7=F)0izlvwP*OZE%!GlmwUz-%-2I6kJ5^U2=UpYSi zL&jvW+?sHz9XQtxd<96+LsAmkDuUr)gOb1VWJi;RcoD^Ps%J?D0N_Nf7r7l0J02U6 z1jBZq78%En`@+8h-^Rm-`A&bDY=B8uchJl>ccI=au(Tok# z+{u6;j&qpgTrBx5#7Kmk&ZEq=$W1uqzK)w4H7`ghf44vHA2?5nvL(o05#=%^zwlq<2+dT?G72x58K zktPRLSwj0x;+xD=dp;ey6^o`CrQQ90m|cE=F5$35ChT}m2zvOQpo)#y>ri5x2W#>p z9tsT$sR>mh4c-li#TSrf<3&qLC1$-qzF(v2MKy%ZrsX)vfA3ar4Iv&i@+a>Krj2_e zV6(gyDJ)eZHD&UxXZema?IGEadqLg-?{J^~0Z&QPKSX<`su6XzX3RoU9>n*b*_8QR zJV6@%XxYzWQ|BvoyP1A%=K>3O(+~W{a7WyJlP&FOerK6yQ6CDvD`%W?E)$z14qc4; zjUZlv1;KA&1fv^A|DLPl-@-SAv1YtvFuolC1wxj>*^z;3;dSRhd8@p`@ukv7ILxtG z?bs}Q^zP=tC0O5?k7?$Ux=}vI%j5=qrGe5|XL+$fQQ^ngW<^1_Se1t6`k@aNzwo&j z`Q(7umpF?(!QJyo=QMS3N&rJEHCf~yY*Aa@)J?RTgHaQxY^Z)5yow3Tthq3>ckL{1e$ZZ=8^gK~p+Jp;Hf zxEh4cWWj)^?3%+0X)_oP9VZ`lJq)sZIY$jPZN$)d65DLC5FoCQ&!JIa!sPchsq1}) z_5X;N^(R@Y&B8pX2=3t9Nm*fXL7n^om`3bVzc zip16dhSoPO*xpn;u?AqsIsvE6g!<=tkRY{4RCi&hw{RIWgP(Bgg)xNR1 zcEOyAs)@A#R4xkCR@cm5+ApSLtpC>V3X__8PJE4oVX~GB&Y5yKZoW!!Eb%zb%uLVVDa_0>)QaPJIxqX#adW9AsndT-@R@cV z?Ces!gy1?A|9p?4W_f&B8Om@3tN4uTbVih9c~+-PJSFYBcctFxG+cM2h0;^kr3}RD zC&R}@(eVE>{PUX1Mwpc4xhrKtR`#8#6S8s)=Y*`>J6uIsBUh&tWsMD`7iX<=qz*_K zm^Bu#qO4q`LD~sfo(WkQMZ}kje`*4}YWY*d_ZMYlhf<5PauyEE$_Ah~E29L7Sx(Nc zytqM5xgyJB@ZEQ$7G>qEb{1#lhFp`gMy9OH$^`&O%onL!Tb_MR%^DeUt#;m#YNVvh z8rVHS@u2b^kcliC+jXt=z9$i8+k{e5emyWNOBpTsdDa21 z8~9`9zY+;FCSYG4vf|HSJTAgc^neW~+#)#fdPSSxk)md0uVx#CoGI02Goek3S?-be zA7Z7S00NW#mVTXlN?I}dwZw3h+>us{u6P}zD_)1g1=japP z<%7lp-%x8n-Ger@@fj(=cL&=piDv!*3IHTdG@wql`%EkUPwo8DjzXWLw3pEG#aSM7 z=H-K=J?^m5|GUcn_kXecL#5J+@E9p?UKtg%bb%1ML1Ycne1%qDZi6+;`^eSa7GKABeuEhTu>3w;yQ6{PoK z{8w2xznVm!cM_*T{&$BHM7^5)FO)Vpt1#t}fmtKLmB5UWxgN{LkJZ z?n=EX&U9ygPIXJAx@w}j!Z${ye!iOE6*Kv9=l9Q zb56<(7O7}Z>PNz$$o^#xd(XPbtfS0;GeDfLSxd$LmMYdoi<)X$&nPOUFXgWaZnw(3busV_~v zAN3um_)!BgN)`BiZQ;8eOhw8~eA5NrP4s$TA3Wr9K7qT491sxy1^nD(ubPSE_PhZy+G4 zGJ1MPr7CjNTCa#y8410>z;kJDARwvAgnr<~{lF*p1NZd<=g8`Pr7BZ;0|7~unW1-7 zsv^=>uZUEIoT~Sgs$AV02uP|@)(`yJe&93vfzRp(KD!_I4gJ99_5+{S4}5+<@SFO9 zFX{(g(+}LH;_lI@N}xNydP-G-{lFLZ17F$;&SQx zk|`inxiy~74m@Pxw|OY%AYLC^cqf~1*dGCqAXR? z@E%^|-S(BLthIyP?y1V{-Jbbym9)#xdT~mguR<=A!&}ldOW^m5e2@fI=Jo^so&~4Q zn0(dr1FyH>Imw9;HuZx0dzELEq!<0PTMm9u15&Cv$0WtvX~C^&C?0dSz>DI~cHlmN zPqH85_n!;AB>rp%ekJhB?Z^22VS!%}f3^dU3j9j@F@FDpz^BHa?ZBS}K0{;x8^-%) z3!a!U%vi4HDas7>Bz_j3 z*}~tGPW%?!+avu{3l1@}+jWfv&*=tL6s|V0edhOoR|>qL2UJmRvfw@Y<@*-?o_vF! zM&-C3+5^*V0>8f(9}8LdvDdBJrCV_9pX_$sWx;#)%RK^L(=9C@ekyPwx^8iQ5_l3* zwqoB9c+w|7kJNBv-Rx(Nh!_XJ(9j>YbwgqfcK;w=J-3{ z!;<7=y9A#KJRv8aYQ2ejH_l0Uz9p?=^k{lMSs2mW?H@b~(Gf7}l|8>BESNuC#bAzGJSuYJM4C-8)vZ%ed4=?C5{ z@Uij!y1@>iqt8+9wx8nj?ZpEBVK4Yhz=tL25jGy4vNSA7k2uH5`TKt0&j@^c9KW6Z zKtJ#k0#E22k6JmuiXky9NguJ{7Yckr96#-tydDL-FFI-I2fnW#_^18AJs668;r~`Y z@C*8ZPwoePHQ>XP$!2BnOIs^1y`S{!`howK;7RCHw7>Ftr=Rqn_5&XT1-P&JezhO? zh<@N|Kk#b+AC{!Y(JspC*8;btZAGDdme*l{mzfXvrQMR(JlIi&DKpIn{MvXP7x?Tr z+{TlJiG7$dHx9S)gakf64i`Hoo*or=LT?f~B;cO`-dFoLPa*zK=ay03itSX0BWmQE@U1fRo!W!Sal9DN7_(6oa3(e0E_@w>U%YwSv3bPaXgf?o&sV<8Q>A>P2;d8Z77csQbT;4ydcF~XBN>UBNldqHgVJ_{*Jjw!ejV*p@c_|l<-*jy+D2o_&aK}{9Y)( zW-bOLr$kANL`YuAlrISK^O-VV5a-Kl^Cd^Vq|TR&`GP24vgS+P3ncvof?txBr&`6*N|1U<{|Uzw%?T{1moJKx zUsb71|GdOsz<0%dQLk~hi@4=2k8$nbUXMUVyeOo-v}fa^8sY z@*9^dDX*!lt*c&CQMDkjw7g!}TCWbdsN7#Z53e)3rB`%uJ|f5$Z>$WIgS(ao=7Uqs zt&79VXGTexsz=oX16KK}$IPn=*3CCDCs!nY6kaMdk%~$Jy!pa%Vy|9|rkGpKkG|9^ z3o92ctgf#F>P3tBg1J?t^;V;eO-@}=TU)Ud9!`tPt11`W7?}SBX^ai_g@}=@&}YKF zh_PR+eI@P>^B199^F`CH?me2mK<*M$sIRO^?qPk^_zPebnnB*)Bg$%--Vs(SBqHpg z)+>h{(JO~N1}{jA!2~)xGCvU+pEEDS{En>{oFn^~Aw@d4>WV3ta4)oGCCo@jIyG=n zdHI|rOY-ycFED3uOyUa`-PqS$559p3A1#gy73CFGRn>FgO;=vIWKLxbzl=oMlA#A@ zF?^1xyt1~ox^`lIN$C|B>65i9ClqPrS5BHVwFCk}(FCoeyw40)yHE4=LS?;JMwbd$L^VkZk)u&BJI0-lUjl~r-}v#?@GoFz@Z(qGy;MFnRIaMsHD9@&y3>d-26 zfr>ddmCu=fQ~A7#1y$XeAb%8!S}}KSIk*$VjL$1f%Kno}_XULx7 zeEw*efvc)O-*uI>fs!c&n7kJSg|~pkEUKWXN>*6{PGbt-@m}flIVeN#4!Aye`BJNtx4cZH(iz8bTYibs766u zgeUW&%JRTse2K2IwjAQaf<=|Sh1$YV7nEoVFT7when%Bt^ncnr7w9UgbB`a30#!r` z1re=A5Nc6l9z4~H5lI1yLIo61n*<1t8c0k6qJj@Zi3p0d7Eq{10+r$u6{KP{#f7!n zYOIQ=t#GY+waa^pkK1;&_Ikhn?C(qd*=IKAoT#+xuDjQoGjo3Py=Twk%*>g=XTE$C z^dB&=-=M+)`TgZfK1jcU!Tkmg7+5eE1abuf3I_}>7&M??9z;O<DO+_DOULw>8vE6U|K6+JHHP!T;I$E~u9 zZQVAeWNJ-i$qcDMg*b3~%G&aI@+!i}Tef@K{5*+g>dcy|%9?U7i?Yd;)sfY-ze3I| za0ltBM_B&v71>)yhx5AJ2Fgl-L)hr<_;bdVv^?Q}m2f0}>K7xolqfPd#u_-Svief# z2`F~UQyOv@g9T7nf}bjhipuG-nUGT?iSl_>)5M#ck(g3B$L*(a#9ir5J?O?K?%-vg zCo0B#M?AT;sS>@$ZNo;+!s(65aqc*UXH0FLAstATY4Z_(bXXJ}X16%>NONe0gM(Jq zaL{Dg;b&4rIZz&(x|CWRD32SNPC$;*<*-N&7|SNloSTo-r&N^5|0?j~PRcf|5`7`g zPX@gqQjLiqQ`MHS;qa|yW=wd|I$1TRy1ZoW%<5WsAE=y$J3&vy;dCp`n#%u;qIL%H zMZ`xb$Eo1UiO*IJJJ%84N&I@^?e%;uSVC^abFOcZ$Dqp zVT0cwgUSCxIYws?clRyeUY|tbRN`Iq`T+P);&y*J_?g7dBKfVv#|QXD$`R+!NWOyP zaZS?VuOYsT_(G4**XsqV0{lQYl!noxGMN2Clp`n4KqxZzR4zuZQ^ZYm_5??*HqFpGtNf zCO(w-lf=&?{w8tm|L+I*hsqHr_mhNN_e4XS+~3*}=l;;mzan|=C(n~S_y6CKJlj85uD7D0KH%2>yC_Fq+Jj5a<4XGuh|T|3@8o!S{aPbZVQ^a z{^I@zG}P@x8BBhs$Ib3L9`6QaX?rLy*s(h~#>;hWG{nPoE7kbTFYZT2tMK>&hZFNW z{*iL+4v~GxTKuQ!eE7YZ_%Pzv5bs6&YT|u~v-~l{Ij>U!-1775Fe@OxFu?5!xNqma zfcy~wo*Up?AI_`2%42!qs;DlG1lNt_%|7IDwbbN?$~2lE{{)9q_~BV{uK!}uwf;~| zcKA5zr^Ig{`6qCi0P$Oi4FJW25s z$}}3{UoV5zp-86Dz<(lx@u`5)!0(d5IG&(^2F`UZBF=R#QI0xe+h}$!C;7XH-#~l= z@mq*v9Wgtrh;#foa45}>b1-p^)7|Iq>fcWE%zh2YbDZ0VbAQ;b9HZf6=QkwJ{oyU* z8%f^X*X`or{`o&7Ur+MwX}NPehbf2J2$JtX@*I!5Pdjye?@M;Le-@A(?w_NGbN`%5 zJW26PlxZ}7dEMf0#CiMnEvf@=PYQ{19Zpe>(MTC=`4*Er*I|@$e?7JTrC~PL;R3S5 zb-)wA(2y6`VG(iOzAYu56dj9`_t%Sw^LCHxlS}Ib*JluMuFvVp;r=YLkGI^SA%3n8 z{vU+q*JlFR;rf)49j?y;;#?oz4sd;VJCGFrR-Z`-MjGPeyvic#)}!ypw8>W}_wzz+ z(fqt_ayZ&=a$Y}D4m+IJuZZ6()8_X;$`|`4ABv&-sp2j^#Ltcjo^%UG|^5g%61|6i}&`9of>M^kf0yikp7r`%vXkw4&ALfSqszl=EB z*+`uCYtfsa)IR^dds*eN-5X1OUn4v9#23mm8scR8IM;;c^Hne$!#}3u8IJ#B7>JQS zmVUoHEc2~CV~KNK^=%_F(S8Sa^_%<#<#5A!4RzvC{JcHKF%KHjz_Encv40A{4sXvZ zv1!9%G&d|s4~8=2oj^1L71LY$8Wo+Hlt$9IS)B__+aNT$&c zC)a0qL|uK(lWCL3I)dic$Ig@Z^{I8@DfOAJ+^^4G;#`Lr)Nh&F{}^D0>+>$jbAA3! zoa@t-`g2ljS-wjs9$qi_c!v2!WQX~3sz0w6We8jvMl63bab7PTCC=-`PF-K%p4W>v zXg#Wzd6ri@OIhGe6Z@-}&_IW$=pTv2+_y=*$s{^eUoL3iG?vq5<@;aL2 zIWIdt_v7c|E{>nCt8)Ak$v($lPMrJCCB$!|IQjP!%ZGkX+5fswPnN%n>@&YFzu?gubH5!%JSjdb z-_gXmzm*c-PVzH|v;1Ymx&GG$_$>jxp7?h1yNNjW|ESbALFGIM;bH@$KTsmhbEUxAVGw zoU2Km{XR&X{XR~d{k}<@?R-R>?X*E4()@T13vj!C0JGWeH%XrPaN^v5&Qbmqv2%e8 zR=0^H&;6%Hx!-^I{sHbk3&{@mpIeA?9X1f>ezk)**YmXi|A08#=lc+tcQ{Crmj*Si z+ZMHh`t+CKpcCZ-W8IE{pCNs9s3?T$1PO{uc!}?{|Jic4|rf zG2&Mc-$s0i$L+em?O%{D44TjG{`lIrk1nMQ*e|IWHJ zqK>bXY3o$<9S2&*!CYCvNAZ{p~#7<%xzm@OIv=BOo5$ z&d;HEczb>gajrif_a?=b)nUF&qrv{uG8lgsP?}#)+unln@7B{Oek=>KGmLl%@x=j- zXHcV|4s7RQ0BIPpofQFY$7#O&6|}za_JMz=Grv0^zYztHh7rr}CeG{iX90c;?H`{J zTUNIdlq3F9;*&_8?c>GcXmE3b3}$B%aqbV(0=zoFuL8Xj3&UUnZ0MHs!F-{p8QYw~)O3?t|ac zi5CM%!{`hdES|H8pGw@W|6(?BH2J9{Kb80r;(R=ITY#@oj=cD|uGP1^AT#zBa%&DTm)_ zWPiw4<%=|M45#5k+65l}K=ZlE<0ik#<0k*C$LBlqiLW2*CeW|e$zb^oA$}k6#l-7~ zuMO}g1AMP?%h%#L^$;;C4e{{)@hali%RGy-9ZyUXE;`5vUUrl_o*fRS+BaUkg#tROUFVg%v%p=ZqIIL5%{IfD?cBT>M_^%J} z`T+0pwPyQ|ko^;huOvR4IQyL*;EMtr&#gl9m*YzT`Tq*=g3itk>iM(`R-e0xbAQ`K zoa>zE;_M)v60*~t`1gp9CeHE`h_igZugBXj4e+G_-mj~(gM9h8aR%{cD9$S7$g7n2 zA4#5492XFuPP|Sz?Bm*;$*&;( z8{+k3X9n^6NuKRILHv1=f0pdbB>oD?vz>Q{vz;D2L|Gc*Unqmc-;?;Y#EX@qJ{WAf zIw8QX2=JQ%eAtm zA06O*k9P8ihu4?y66fDp8v^{~W18(Ol1Zz>DasMg<-}`Ap6x##;GJ?rSsLPG`8#t! z9q0Hv^lIie$fU({XMjH*;D03k0@>+)T(f=Vc>zAVx06R5c>TRnIr8HEe?7@V$KwA{ zK>o)8`Srw4BRe~Z4{&W%X z?V@A$mn(<;S;SY8Ja13dlKgCv-$L?S=jVyDoxhNsO0x4=K)&7aA|wrQVzBtTC`TP` zC4NkRpAg^!iQh(c&LqzEM+f)?0X{vzYXbZ#;hWRfw<^HrdmQf~N2?3)6&|-uAdXci>}>+kF6^d3;$Lm)9XDxUtpQ&WrW%xLx<^DGjaaiWY=xsj*mm^`554oeOqt98;QS4@^!>N4DiJ;APpmy=j(BcWuEm1zQ2Y0 z6`xP$h?mHB4>uf(~3c5WM)iPqm@l0RHI;;$#(i#YFp^8$PX@r`6> zGVvsFdygXg@^a++ySSbr7Bwt}mu1k?J5A4t2mfs((eeZQRT<*sUm;PO5BZmfx7TT( zv-~cS*TaVdoi8=h-(*) z$VJ4pD@CM=xGvI&B#B#&KzoTJCTm9_aA{x|u9g99De(>tMW6Q)*Hf4g|26TBB>w?% zJ;mteY7iJ%%`wB?8w~z60Bv@h1>V`9jQKia7vlDRQpoG6tZ42v0Man(8cn$mzCPHE z_-2yVQ%cd?Pl;RKz>I@*VPm$QdWq!if4<;)3MAtEJS9D)5%HyDM^8mW+`U)G#jmFv zB5wCX!v4__aUVO#j{fwIW^~X_2KgK(8hv&pek^f*eo;^2<4L|3@%hA$BmN2T-o!^} z=SDnzh<}&3{xpo{t|opw$>Y5|Xt1L{HKOlt6W2r6h!4`02l9HT74cETF|P<8(#8|d zbtw9*Bd&)w5x<2v~43mV1ap$L?2npE&FfR$E84a}$t7Jhpx5 zO&s#0omgTR@j_)7olP9_Wjb#W@qWrMT1Fi5SLnQ#iT78A(eH^v{$ZV$qZ==a-`-nj z_g#QPez$I4CXoC8b{)l*d~R!=tEkr%#!pk8Lgy zrxoS<5N%5+z?^UV}3gKW0i`j=F+w3zZNO8+^Rt_&@5OVx>c(0Nq8ed}fLxWX9s z&5woEr+n{I#-1OZ8cvEGdH84aqK!mubtU={mUUCb_uo^)(ZTa`<%JCY0#V3|B3dlM ze?mFp*TH{EAb|yv{$c6q7HOsy_PIFH8_A%QnHY&FLpINLcf~*|scTvGcCeoCcD$)$ zWMe8#VX`w7m)7Tco_uq`;uHN`#?z(#IgRhD7_EBrd#1%`mGMlA(Msbn#n^w(^iNZ` z{TE1@BJa;YVirh#i?irLCD*Xj`NK?Wu#6#NJv}z^Dsy40ikX3D3=^?H*c)Q7d zd<#XoLhk2q(p7!Ghts@>QjYUu-__yj=^ssGrpt#isT!?+-$$k~wcZ0q-gM-IE%2BA zN|7}EcfZ7trqk}H7@B)(izV=-zhWi6ckSO8GFSp%dL6tU5X~#_7x31ZmcLE@RbN0u zQO=oNG4tZ`ipx?Lj8~@AlR(}J9o?%`>_=X7PNT(dKKB-rOy8Rlzq!cHM!F0#I31Pg zYgk&O-D0OAZyl3YX;cL_yy;(m5?_iI>uq`?UqCG~ew~UHBmQ+K^ja0y52I6W@|#}N zttq705kCF|#P-1i0wOzbgu7$7N>R3!`*a ziXPq@6|WY}(LLCdn%d?yT)xQLVVmdR&9>2rnx;a#Ecf;PQh8JFtXbu=<+T3n%G&bW z;pdD$DSBz2ewUY~<>DpA@)9-KUPZ>sXOv8hx0B`KB3}nJi$yx2 zmn)+G*x>$Oy}Z^m4(X3jeY^I$PQG7~h5iK9&(SgTF=Xn0p6c1PW$0FCp}#0bza|U) zjWPOnWud<(M*p5H z^!LW--9bN=^bq2EcbJF@=$S?K4)=s%E!zCCY({Xdw6ev$g;{<|p){ZTRc z_w~O z4Kez^%tHT>82!d9^c!OIU(7<^?l*|9Rb(41-#rNMk;6E=z|2d)`SO2{+{!feXkLM4@%n&mZ?4$N6uMoxL<({zK%u zpMQn=$GXAoP%WIv+dRaIX5)_n`rTC@+jnke&-C#>kGTAcRDY=67i%{B{O5^&T>fJ; z{~UFM{x?(x^Kbp)Z|dLQelFCTmwT9F9b4RnuNCKDe*IRfKHoD99n-h*j)4AF)yMvc zo5gSXczzJ3{q<+B>TmXTjDG#_p4GVeRqb?Mxqib1nSZNavHJJxxBghC-_?zpJ}qto zczzI=U%v*`?`eWMHveYlw*mdPRNwATHZ!JY<74E&2h)E266$zHn)>0nLUHw5{;Kns zl=TB`oeZO7u=uTh-&6m7{buxrRwBXo#N)fgjcK%>s=i;pI@RZU$suq4%}#qcz=_Mh zLG_nw{Ln@7`%fFukIO&rbtj*rj*$Nt8O*=sKT-Yr`Hwl?>8D%&wy3_Jf0gQ|%fG7x z6qkQe_3eLOE}GQ*JBfZ={$t*78l3;QnEa=ye?R~J8hE<=pHh84|1qk6i3P4>5s#WJ z|8u??pMRt3-(iBP=P&<}q92!k)$g3bN?QIC1et$Z{?Dm@KY#nbX1e}A?qCig?|gX*X2{|}3PT>kCfbS`=MUnt1@TmBsnaq;{4kI}%>E&nRj z_w%n({dD=itonZbNmWeO|6dUOxcrabotl4XO#Xd4#OL2%cYNvcU#j|k{$o`CdKX61 zr`6w<|2O1MVwm>x-=q5J`hR!PkIR3=9_Nz#|5QQd-Cwn{=Ac)29e>W64{ja-G)2GF4;5F6v z^IucsB#tsc9h<(5OTHFZeyVTJbu}~o@|z_3arv)&+i7tA)q?!|UseBp{;v&n`swm7 z?HnKfUe(_%$EV!<_%9IsxcIle&|zI$EDHlARQdG{O$jPs=v$}sU1K6cA}3Ii@f}2eC!kksXp?*S_X^Xwm%~S z{);9${VG#%UsHa63=8;Ae&Q5Lb^8hb3uQ2K=Kp^6@7MpqGN-Sn!Q2=5v~t*ZyT#um z;U*eYe~BJP+HAjmKezZzz{Y=d6PT&5P#`SPCw6$nm$e6;y+w|pkvx! z{>xQ=Lz?|hXVE`U^!?@E=`iPEk2*s9buyTLtN-|b|Dqp=u(XA3-Pk_;`i%+r->VnE zpCSKC#E9>IoBH>+|BWl1M?H;V?o;~T`>Nl@>;HRI-;dY)o58mO@o(+y0=MOd`Yn^e z^sRn}O9zFdAAj^v8Q}wE;FiN*WV%H4{rCs1a)Rc^)XcwqpCtNm%l|!%e}oDm{^c^5 zzS+Gu;D3zz&ry9FnZA9$JK#T0UjWDc(WOk^{O=C>jD4sV*LLw#{WsOej_Ho z{>#HGf|peHG2dn*;jMLzYCY2*T7l>9mcXQGI{;72WOxElxAxe}78!6`vFK(o@ekDp<5sKs%rI?w#&MlMPQfL-&0k`k>gSlC zjxBz}y+uFTei_j5O4V=h6uhsA9MO;J=jrd#`ZenDH|n=m2Gh6t#rcM*3HA7tvFu;b v*2{3248FdczDl|FEGY5dqxh6(?s)5;UqAWz5v#x92q!tf0*$Pt*8hJ22;!v5 literal 83640 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 diff --git a/src/main.cpp b/src/main.cpp index e85ed5f..0a77c81 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,20 +24,20 @@ int main(int argc, char const *argv[]) { utils::Mf X(10,2, 0); - utils::Matrix y(10,1, 0); - utils::Vector class_targets; + utils::Matrix y(10,1, 0); + 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::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; + neural_networks::Loss_CategoricalCrossentrophy loss_funtion; float lowest_loss = 9999999; utils::Mf best_dense_1_weights = dense1.weights; @@ -47,7 +47,7 @@ int main(int argc, char const *argv[]) utils::Vf vectRND; - utils::Vector predections; + utils::Vector predections; @@ -73,10 +73,10 @@ int main(int argc, char const *argv[]) // 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); + predections = numerics::matargmax_row(activation2.outputs); if (y.cols() < 1){ - class_targets = numerics::matargmax_row(y); + class_targets = numerics::matargmax_row(y); }else{ class_targets = y.get_col(0); }