1#ifndef PROG3_NN_FINAL_PROJECT_V2025_01_DENSE_H
2#define PROG3_NN_FINAL_PROJECT_V2025_01_DENSE_H
15 class Dense final :
public ILayer<T> {
17 algebra::Tensor<T, 2> weights;
20 algebra::Tensor<T, 2> biases;
23 algebra::Tensor<T, 2> activations;
26 algebra::Tensor<T, 2> gradient_weights;
29 algebra::Tensor<T, 2> gradient_biases;
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}) {}
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) {
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);
105 optimizer.
update(weights, gradient_weights);
106 optimizer.
update(biases, gradient_biases);
122 void save(std::ostream& out)
const override {
126 for (
const auto&
x : weights) {
130 for (
const auto&
x : biases) {
143 Dense<T> result(in_feats, out_feats);
145 for (
auto&
x : result.weights) {
149 for (
auto&
x : result.biases) {
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 > ¶ms, const algebra::Tensor< T, 2 > &gradients)=0
Actualiza los parámetros del modelo usando los gradientes.