From a1924d6491c041348ff71b03cda9ae9a286acde4 Mon Sep 17 00:00:00 2001 From: ProdigiousPersonn Date: Thu, 5 Feb 2026 17:27:34 -0800 Subject: [PATCH] Resnet +Fix Shared Ptr Error --- include/ml_lib/models/neural-network-ff.h | 2 +- include/ml_lib/models/neural-network-resnet.h | 22 ++++++++ include/ml_lib/models/perceptron.h | 2 +- source/models/neural-network-ff-resnet.cpp | 51 +++++++++++++++++++ source/models/neural-network-ff.cpp | 4 +- source/models/perceptron.cpp | 4 +- 6 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 include/ml_lib/models/neural-network-resnet.h create mode 100644 source/models/neural-network-ff-resnet.cpp diff --git a/include/ml_lib/models/neural-network-ff.h b/include/ml_lib/models/neural-network-ff.h index 6328473..65dd3f1 100644 --- a/include/ml_lib/models/neural-network-ff.h +++ b/include/ml_lib/models/neural-network-ff.h @@ -11,7 +11,7 @@ class NeuralNetworkFF : public GradientModel { Matrix last_output; public: - NeuralNetworkFF(int input_dim, LossFunction* loss, Optimizer* opt, Regularizer* reg); + NeuralNetworkFF(int input_dim, std::unique_ptr loss, std::unique_ptr opt, std::unique_ptr reg); void addLayer(int input_dim, int output_dim, ACTIVATION_FUNC act); diff --git a/include/ml_lib/models/neural-network-resnet.h b/include/ml_lib/models/neural-network-resnet.h new file mode 100644 index 0000000..3bf0a74 --- /dev/null +++ b/include/ml_lib/models/neural-network-resnet.h @@ -0,0 +1,22 @@ +#pragma once +#include "../math/matrix.h" +#include "gradient-model.h" +#include "../core/neural-network-layer.h" + +class NeuralNetworkResNet : public GradientModel { + private: + std::vector layers; + + Matrix last_input; + Matrix last_output; + int skips = 2; // Number of layers after which to add a skip connection + + public: + NeuralNetworkResNet(int input_dim, std::unique_ptr loss, std::unique_ptr opt, std::unique_ptr reg, int skips = 2); + + void addLayer(int input_dim, int output_dim, ACTIVATION_FUNC act); + + Matrix forward(const Matrix& X) override; + void backward(const Matrix& y_true) override; + void update() override; +}; \ No newline at end of file diff --git a/include/ml_lib/models/perceptron.h b/include/ml_lib/models/perceptron.h index b102f47..ba9a9b4 100644 --- a/include/ml_lib/models/perceptron.h +++ b/include/ml_lib/models/perceptron.h @@ -17,7 +17,7 @@ class Perceptron : public GradientModel { Matrix grad_b; public: - Perceptron(int input_dim, LossFunction* loss, Optimizer* opt, Regularizer* reg); + Perceptron(int input_dim, std::unique_ptr loss, std::unique_ptr opt, std::unique_ptr reg); Matrix forward(const Matrix& X) override; void backward(const Matrix& y_true) override; diff --git a/source/models/neural-network-ff-resnet.cpp b/source/models/neural-network-ff-resnet.cpp new file mode 100644 index 0000000..f508a2a --- /dev/null +++ b/source/models/neural-network-ff-resnet.cpp @@ -0,0 +1,51 @@ +#include "neural-network-resnet.h" +#include "neural-network-layer.h" +#include + +NeuralNetworkResNet::NeuralNetworkResNet(int input_dim, std::unique_ptr loss, std::unique_ptr opt, std::unique_ptr reg, int skips) + : GradientModel(std::move(loss), std::move(opt), std::move(reg)), skips(skips) +{} + +void NeuralNetworkResNet::addLayer(int input_dim, int output_dim, ACTIVATION_FUNC act) +{ + this->layers.push_back(NeuralNetworkLayer(input_dim, output_dim, act)); +} + +Matrix NeuralNetworkResNet::forward(const Matrix &X) +{ + last_input = X; + Matrix residual = X; + + for (int i = 0; i < layers.size(); i++) { + last_input = layers[i].forward(last_input); + + if ((i + 1) % skips == 0 && last_input.rows() == residual.rows() && last_input.cols() == residual.cols()) { + last_input = last_input + residual; + residual = last_input; + } + } + last_output = last_input; + + return last_output; +} + +void NeuralNetworkResNet::backward(const Matrix &y_true) +{ + Matrix last_gradient = loss_func->gradient(last_output, y_true); + for (int i = layers.size() - 1; i >= 0; i--) { + Matrix layer_grad = layers[i].backward(last_gradient); + + if ((i + 1) % skips == 0) { + last_gradient = layer_grad + last_gradient; + } else { + last_gradient = layer_grad; + } + } +} + +void NeuralNetworkResNet::update() +{ + for (auto& layer : layers) { + layer.update(optimizer.get()); + } +} diff --git a/source/models/neural-network-ff.cpp b/source/models/neural-network-ff.cpp index 07ba81d..5f60add 100644 --- a/source/models/neural-network-ff.cpp +++ b/source/models/neural-network-ff.cpp @@ -2,8 +2,8 @@ #include "neural-network-layer.h" #include -NeuralNetworkFF::NeuralNetworkFF(int input_dim, LossFunction *loss, Optimizer *opt, Regularizer *reg) - : GradientModel(loss, opt, reg) +NeuralNetworkFF::NeuralNetworkFF(int input_dim, std::unique_ptr loss, std::unique_ptr opt, std::unique_ptr reg) + : GradientModel(std::move(loss), std::move(opt), std::move(reg)) {} void NeuralNetworkFF::addLayer(int input_dim, int output_dim, ACTIVATION_FUNC act) diff --git a/source/models/perceptron.cpp b/source/models/perceptron.cpp index 0c2f7da..5d5c1cc 100644 --- a/source/models/perceptron.cpp +++ b/source/models/perceptron.cpp @@ -1,8 +1,8 @@ #include "ml_lib/models/perceptron.h" #include -Perceptron::Perceptron(int input_dim, LossFunction* loss, Optimizer* opt, Regularizer* reg) - : GradientModel(loss, opt, reg), weights(input_dim, 1, 0.01), bias(1, 1, 0.0), +Perceptron::Perceptron(int input_dim, std::unique_ptr loss, std::unique_ptr opt, std::unique_ptr reg) + : GradientModel(std::move(loss), std::move(opt), std::move(reg)), weights(input_dim, 1, 0.01), bias(1, 1, 0.0), grad_w(input_dim, 1, 0.0), grad_b(1, 1, 0.0) {} Matrix Perceptron::forward(const Matrix &X)