FlexNN 1
Fully connected neural network built from scratch with flexible n-layer design and multiple activations.
Loading...
Searching...
No Matches
Pool1D.hpp
Go to the documentation of this file.
1
10#pragma once
11
12#include <utility>
13#include <vector>
14
15#include <Eigen/Dense>
16
17#include "LayerTypes.hpp"
18#include "../activations/Activation.hpp"
19
20namespace FlexNN::Layers {
21
22class MaxPool1D {
23 public:
24 explicit MaxPool1D(Pool1DParams p,
26
27 LayerType type() const noexcept { return LayerType::MaxPool1D; }
28 Activations::Activation activation() const noexcept { return act_; }
29 const Pool1DParams& params() const noexcept { return params_; }
30
31 std::pair<Eigen::MatrixXd, Eigen::MatrixXd> forward(
32 const Eigen::MatrixXd& input) const;
33 Eigen::MatrixXd backward(const Eigen::MatrixXd& upstream,
34 const Eigen::MatrixXd& currZ) const;
35 Eigen::MatrixXd backward(const Eigen::MatrixXd& nextW,
36 const Eigen::MatrixXd& nextdZ,
37 const Eigen::MatrixXd& currZ) const;
38 Eigen::MatrixXd propagate(const Eigen::MatrixXd& dZ) const;
39 std::pair<Eigen::MatrixXd, Eigen::VectorXd> grad(
40 const Eigen::MatrixXd& dZ, const Eigen::MatrixXd& input) const;
41 void update(const Eigen::MatrixXd& dW, const Eigen::VectorXd& db,
42 double lr) noexcept;
43 void updateWeights(const Eigen::MatrixXd& dW, const Eigen::VectorXd& db,
44 double lr) noexcept {
45 update(dW, db, lr);
46 }
47
48 private:
49 int l_out(int L_in) const noexcept;
50 Pool1DParams params_{};
52 // Cache for backward: argmax indices per [C*L_out × batch] -> flat index
53 mutable std::vector<std::vector<int>> argmax_cache_; // per batch, per output
54 mutable int last_L_in_ = 0;
55 mutable int last_batch_ = 0;
56};
57
58class AvgPool1D {
59 public:
60 explicit AvgPool1D(Pool1DParams p,
62
63 LayerType type() const noexcept { return LayerType::AvgPool1D; }
64 Activations::Activation activation() const noexcept { return act_; }
65 const Pool1DParams& params() const noexcept { return params_; }
66
67 std::pair<Eigen::MatrixXd, Eigen::MatrixXd> forward(
68 const Eigen::MatrixXd& input) const;
69 Eigen::MatrixXd backward(const Eigen::MatrixXd& upstream,
70 const Eigen::MatrixXd& currZ) const;
71 Eigen::MatrixXd backward(const Eigen::MatrixXd& nextW,
72 const Eigen::MatrixXd& nextdZ,
73 const Eigen::MatrixXd& currZ) const;
74 Eigen::MatrixXd propagate(const Eigen::MatrixXd& dZ) const;
75 std::pair<Eigen::MatrixXd, Eigen::VectorXd> grad(
76 const Eigen::MatrixXd& dZ, const Eigen::MatrixXd& input) const;
77 void update(const Eigen::MatrixXd& dW, const Eigen::VectorXd& db,
78 double lr) noexcept;
79 void updateWeights(const Eigen::MatrixXd& dW, const Eigen::VectorXd& db,
80 double lr) noexcept {
81 update(dW, db, lr);
82 }
83
84 private:
85 int l_out(int L_in) const noexcept;
86 Pool1DParams params_{};
88};
89
90} // namespace FlexNN::Layers
Shared PODs for FlexNN::Layers — LayerType, DType, and per-type Params.
Definition Pool1D.hpp:58
const Pool1DParams & params() const noexcept
Definition Pool1D.hpp:65
std::pair< Eigen::MatrixXd, Eigen::VectorXd > grad(const Eigen::MatrixXd &dZ, const Eigen::MatrixXd &input) const
Definition Pool1D.cpp:233
Eigen::MatrixXd propagate(const Eigen::MatrixXd &dZ) const
Definition Pool1D.cpp:203
void update(const Eigen::MatrixXd &dW, const Eigen::VectorXd &db, double lr) noexcept
Definition Pool1D.cpp:238
void updateWeights(const Eigen::MatrixXd &dW, const Eigen::VectorXd &db, double lr) noexcept
Definition Pool1D.hpp:79
LayerType type() const noexcept
Definition Pool1D.hpp:63
Activations::Activation activation() const noexcept
Definition Pool1D.hpp:64
std::pair< Eigen::MatrixXd, Eigen::MatrixXd > forward(const Eigen::MatrixXd &input) const
Definition Pool1D.cpp:156
Eigen::MatrixXd backward(const Eigen::MatrixXd &upstream, const Eigen::MatrixXd &currZ) const
Definition Pool1D.cpp:188
Definition Pool1D.hpp:22
const Pool1DParams & params() const noexcept
Definition Pool1D.hpp:29
LayerType type() const noexcept
Definition Pool1D.hpp:27
void update(const Eigen::MatrixXd &dW, const Eigen::VectorXd &db, double lr) noexcept
Definition Pool1D.cpp:140
Eigen::MatrixXd propagate(const Eigen::MatrixXd &dZ) const
Definition Pool1D.cpp:100
std::pair< Eigen::MatrixXd, Eigen::MatrixXd > forward(const Eigen::MatrixXd &input) const
Definition Pool1D.cpp:36
Eigen::MatrixXd backward(const Eigen::MatrixXd &upstream, const Eigen::MatrixXd &currZ) const
Definition Pool1D.cpp:85
Activations::Activation activation() const noexcept
Definition Pool1D.hpp:28
std::pair< Eigen::MatrixXd, Eigen::VectorXd > grad(const Eigen::MatrixXd &dZ, const Eigen::MatrixXd &input) const
Definition Pool1D.cpp:134
void updateWeights(const Eigen::MatrixXd &dW, const Eigen::VectorXd &db, double lr) noexcept
Definition Pool1D.hpp:43
Activation
Activation function identifier.
Definition Activation.hpp:41
@ None
Linear, no activation.
Definition BatchNorm1D.hpp:24
LayerType
Layer kind, stable on-wire (uint8_t).
Definition LayerTypes.hpp:22
@ MaxPool1D
Max pooling, weightless.
@ AvgPool1D
Average pooling, weightless.
Parameters for pooling layers (Max and Avg share this POD).
Definition LayerTypes.hpp:78