|
FlexNN 1
Fully connected neural network built from scratch with flexible n-layer design and multiple activations.
|
Fully-connected layer: Z = W*X + b, A = act(Z).
More...
#include <Dense.hpp>
Public Member Functions | |
| Dense (int in, int out, Activations::Activation act=Activations::Activation::ReLU, const Activations::ActivationParameters ¶ms=Activations::ActivationParameters{}) | |
| Construct Dense with input/output sizes and activation. | |
| Dense (DenseParams p, Activations::Activation act=Activations::Activation::ReLU, const Activations::ActivationParameters ¶ms=Activations::ActivationParameters{}) | |
| Construct from DenseParams POD. | |
| Dense (int in, int out, const std::string &actStr) | |
| Deprecated string ctor — delegates to enum via try_parse. | |
| LayerType | type () const noexcept |
| Activations::Activation | activation () const noexcept |
| const Activations::ActivationParameters & | activationParams () const noexcept |
| const DenseParams & | params () const noexcept |
| const Eigen::MatrixXd & | weights () const noexcept |
| const Eigen::VectorXd & | biases () const noexcept |
| void | setWeights (const Eigen::MatrixXd &W) |
| void | setBiases (const Eigen::VectorXd &b) |
| void | setActivationParameters (const Activations::ActivationParameters &p) |
| std::pair< Eigen::MatrixXd, Eigen::MatrixXd > | forward (const Eigen::MatrixXd &input) const |
Forward pass: Z = W*X + b, A = act(Z). | |
| Eigen::MatrixXd | backward (const Eigen::MatrixXd &nextW, const Eigen::MatrixXd &nextdZ, const Eigen::MatrixXd &currZ) const |
Backward: ‘dZ = f’(Z) ⊙ (W_next^T * dZ_next)ordZ = W_next^T*dZ_next` if None. | |
| Eigen::MatrixXd | backward (const Eigen::MatrixXd &upstream, const Eigen::MatrixXd &currZ) const |
| Backward with already-propagated upstream (W_next^T*dZ_next). | |
| Eigen::MatrixXd | propagate (const Eigen::MatrixXd &dZ) const |
Propagate gradient to previous layer: dX = W^T * dZ. | |
| void | update (const Eigen::MatrixXd &dW, const Eigen::VectorXd &db, double lr) noexcept |
SGD update: W -= lr*dW, b -= lr*db. | |
Fully-connected layer: Z = W*X + b, A = act(Z).
Layout: X is [in × batch] column-major, W is [out × in], b is [out] broadcast column-wise. Activation is applied elementwise via FlexNN::Activations::detail.
| FlexNN::Layers::Dense::Dense | ( | int | in, |
| int | out, | ||
| Activations::Activation | act = Activations::Activation::ReLU, |
||
| const Activations::ActivationParameters & | params = Activations::ActivationParameters{} |
||
| ) |
Construct Dense with input/output sizes and activation.
Initializes W and b with Random * 0.5 (same as legacy include/Layer.h:55). Kept for v0.1 compatibility; future versions may use Xavier/He initialization.
| in | Number of input features |
| out | Number of output neurons |
| act | Activation (default ReLU) |
|
explicit |
Construct from DenseParams POD.
| FlexNN::Layers::Dense::Dense | ( | int | in, |
| int | out, | ||
| const std::string & | actStr | ||
| ) |
Deprecated string ctor — delegates to enum via try_parse.
Kept for one release so Dense(784,64,"relu") still compiles with a deprecation warning. On parse failure, activation is None.
|
inlinenoexcept |
|
inlinenoexcept |
| Eigen::MatrixXd FlexNN::Layers::Dense::backward | ( | const Eigen::MatrixXd & | nextW, |
| const Eigen::MatrixXd & | nextdZ, | ||
| const Eigen::MatrixXd & | currZ | ||
| ) | const |
Backward: ‘dZ = f’(Z) ⊙ (W_next^T * dZ_next)ordZ = W_next^T*dZ_next` if None.
For Softmax hidden, this uses detail::softmax_backward_hidden via Activations::detail::backward. Last-layer Softmax is fused in NeuralNetwork::backward and never calls this for the last layer. activationParams threaded for LeakyReLU alpha.
| nextW | Weights of next layer (or empty for last layer) |
| nextdZ | Gradient of next layer's Z |
| currZ | This layer's pre-activation Z from forward |
| Eigen::MatrixXd FlexNN::Layers::Dense::backward | ( | const Eigen::MatrixXd & | upstream, |
| const Eigen::MatrixXd & | currZ | ||
| ) | const |
Backward with already-propagated upstream (W_next^T*dZ_next).
Used by NeuralNetwork::backward after layers[i+1].propagate(dZ_next) so the caller handles Conv1D transpose via col2im. Equivalent to the three-arg version but skips the nextW multiply.
| upstream | Already W_next^T * dZ_next (or propagate result) |
| currZ | This layer's Z |
|
inlinenoexcept |
| std::pair< Eigen::MatrixXd, Eigen::MatrixXd > FlexNN::Layers::Dense::forward | ( | const Eigen::MatrixXd & | input | ) | const |
Forward pass: Z = W*X + b, A = act(Z).
| input | Batch input [in × batch] |
[out × batch]
|
inlinenoexcept |
| Eigen::MatrixXd FlexNN::Layers::Dense::propagate | ( | const Eigen::MatrixXd & | dZ | ) | const |
Propagate gradient to previous layer: dX = W^T * dZ.
| dZ | Gradient w.r.t. Z of this layer [out × batch] |
[in × batch]
|
inline |
|
inline |
|
inline |
|
inlinenoexcept |
|
noexcept |
SGD update: W -= lr*dW, b -= lr*db.
|
inlinenoexcept |