Proyecto Final - Turinmachin
Recreación del minijuego de matemáticas de Brain-Age usando redes neuronales
Loading...
Searching...
No Matches
dense.h
Go to the documentation of this file.
1#ifndef PROG3_NN_FINAL_PROJECT_V2025_01_DENSE_H
2#define PROG3_NN_FINAL_PROJECT_V2025_01_DENSE_H
3
4#include "interfaces.h"
6
13namespace utec::neural_network {
14 template <typename T>
15 class Dense final : public ILayer<T> {
17 algebra::Tensor<T, 2> weights;
18
20 algebra::Tensor<T, 2> biases;
21
23 algebra::Tensor<T, 2> activations;
24
26 algebra::Tensor<T, 2> gradient_weights;
27
29 algebra::Tensor<T, 2> gradient_biases;
30
31 public:
38 Dense(const size_t in_f, const size_t out_f)
39 : weights(std::array{in_f, out_f}),
40 biases(std::array<size_t, 2>{1, out_f}),
41 activations(std::array<size_t, 2>{1, out_f}),
42 gradient_weights(std::array{in_f, out_f}),
43 gradient_biases(std::array<size_t, 2>{1, out_f}) {}
44
54 Dense(const size_t in_f, const size_t out_f, auto init_w_fun, auto init_b_fun)
55 : Dense(in_f, out_f) {
56 init_w_fun(weights);
57 init_b_fun(biases);
58 }
59
72 activations = x;
73 return algebra::matrix_product(x, weights) + biases;
74 }
75
87 gradient_weights = algebra::matrix_product(activations.transpose_2d(), dZ);
88 auto dZ_shape = dZ.shape();
89 gradient_biases.fill(T(0));
90 for (size_t i = 0; i < dZ_shape[0]; i++) {
91 for (size_t j = 0; j < dZ_shape[1]; j++) {
92 gradient_biases(0, j) += dZ(i, j);
93 }
94 }
95 return algebra::matrix_product(dZ, weights.transpose_2d());
96 }
97
104 void update_params(IOptimizer<T>& optimizer) override {
105 optimizer.update(weights, gradient_weights);
106 optimizer.update(biases, gradient_biases);
107 }
108
114 [[nodiscard]] auto id() const -> LayerId override {
115 return LayerId::Dense;
116 }
117
122 void save(std::ostream& out) const override {
123 serialization::write_numeric<std::uint64_t>(out, weights.shape()[0]);
124 serialization::write_numeric<std::uint64_t>(out, weights.shape()[1]);
125
126 for (const auto& x : weights) {
128 }
129
130 for (const auto& x : biases) {
132 }
133 }
134
139 static auto load(std::istream& in) -> Dense<T> {
140 const auto in_feats = serialization::read_numeric<std::uint64_t>(in);
141 const auto out_feats = serialization::read_numeric<std::uint64_t>(in);
142
143 Dense<T> result(in_feats, out_feats);
144
145 for (auto& x : result.weights) {
147 }
148
149 for (auto& x : result.biases) {
151 }
152
153 return result;
154 }
155 };
156} // namespace utec::neural_network
157
158#endif
return p * x
Definition catch_amalgamated.cpp:321
Dense(const size_t in_f, const size_t out_f)
Constructor que inicializa los tensores internos con ceros.
Definition dense.h:38
Representa un tensor de tipo T y rango Rank.
Definition tensor.h:63
void save(std::ostream &out) const override
Guarda la red neuronal en formato pp20.
Definition dense.h:122
Dense(const size_t in_f, const size_t out_f)
Constructor que inicializa los tensores internos con ceros.
Definition dense.h:38
auto backward(const algebra::Tensor< T, 2 > &dZ) -> algebra::Tensor< T, 2 > override
Propagación hacia atrás (backpropagation). Calcula los gradientes con respecto a pesos,...
Definition dense.h:86
Dense(const size_t in_f, const size_t out_f, auto init_w_fun, auto init_b_fun)
Constructor que permite inicializar pesos y biases con funciones personalizadas.
Definition dense.h:54
void update_params(IOptimizer< T > &optimizer) override
Actualiza los parámetros (pesos y biases) usando un optimizador.
Definition dense.h:104
auto id() const -> LayerId override
Devuelve el tipo identificador de esta capa.
Definition dense.h:114
auto forward(const algebra::Tensor< T, 2 > &x) -> algebra::Tensor< T, 2 > override
Propagación hacia adelante de la capa. Calcula: output = x * weights + biases.
Definition dense.h:71
static auto load(std::istream &in) -> Dense< T >
Carga la red neuronal en formato pp20.
Definition dense.h:139
auto read_numeric(std::istream &in) -> T
Definition serialization.h:17
void write_numeric(std::ostream &out, const T n)
Definition serialization.h:9
constexpr auto matrix_product(const Tensor< T, 2 > &lhs, const Tensor< T, 2 > &rhs) -> Tensor< T, 2 >
Realiza producto matricial entre 2 tensores de dimension 2.
Definition tensor.h:563
Capa de activación de Rectified Linear Unit (ReLU). Los valores negativos del input se convierten en ...
Definition activation.h:14
LayerId
Identificador para los diferentes tipos de capas en la red neuronal. Se emplea uint8_t (unsigned 8-bi...
Definition interfaces.h:11
@ Dense
Definition interfaces.h:14
Interfaz para definir un optimizador (ej. SGD, Adam, ...). Un optimizador se encarga de actualizar lo...
Definition interfaces.h:26
virtual void update(algebra::Tensor< T, 2 > &params, const algebra::Tensor< T, 2 > &gradients)=0
Actualiza los parámetros del modelo usando los gradientes.