FlexNN 1
Fully connected neural network built from scratch with flexible n-layer design and multiple activations.
Loading...
Searching...
No Matches
FlexNN::Layers::Dense Class Reference

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 &params=Activations::ActivationParameters{})
 Construct Dense with input/output sizes and activation.
 
 Dense (DenseParams p, Activations::Activation act=Activations::Activation::ReLU, const Activations::ActivationParameters &params=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.
 

Detailed Description

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.

Constructor & Destructor Documentation

◆ Dense() [1/3]

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.

Parameters
inNumber of input features
outNumber of output neurons
actActivation (default ReLU)

◆ Dense() [2/3]

Construct from DenseParams POD.

◆ Dense() [3/3]

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.

Member Function Documentation

◆ activation()

Activations::Activation FlexNN::Layers::Dense::activation ( ) const
inlinenoexcept

◆ activationParams()

const Activations::ActivationParameters & FlexNN::Layers::Dense::activationParams ( ) const
inlinenoexcept

◆ backward() [1/2]

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.

Parameters
nextWWeights of next layer (or empty for last layer)
nextdZGradient of next layer's Z
currZThis layer's pre-activation Z from forward
Returns
Gradient w.r.t. this layer's Z

◆ backward() [2/2]

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.

Parameters
upstreamAlready W_next^T * dZ_next (or propagate result)
currZThis layer's Z
Returns
Gradient w.r.t. Z

◆ biases()

const Eigen::VectorXd & FlexNN::Layers::Dense::biases ( ) const
inlinenoexcept

◆ forward()

std::pair< Eigen::MatrixXd, Eigen::MatrixXd > FlexNN::Layers::Dense::forward ( const Eigen::MatrixXd &  input) const

Forward pass: Z = W*X + b, A = act(Z).

Parameters
inputBatch input [in × batch]
Returns
Pair (Z, A) each [out × batch]

◆ params()

const DenseParams & FlexNN::Layers::Dense::params ( ) const
inlinenoexcept

◆ propagate()

Eigen::MatrixXd FlexNN::Layers::Dense::propagate ( const Eigen::MatrixXd &  dZ) const

Propagate gradient to previous layer: dX = W^T * dZ.

Parameters
dZGradient w.r.t. Z of this layer [out × batch]
Returns
Gradient w.r.t. input [in × batch]

◆ setActivationParameters()

void FlexNN::Layers::Dense::setActivationParameters ( const Activations::ActivationParameters &  p)
inline

◆ setBiases()

void FlexNN::Layers::Dense::setBiases ( const Eigen::VectorXd &  b)
inline

◆ setWeights()

void FlexNN::Layers::Dense::setWeights ( const Eigen::MatrixXd &  W)
inline

◆ type()

LayerType FlexNN::Layers::Dense::type ( ) const
inlinenoexcept

◆ update()

void FlexNN::Layers::Dense::update ( const Eigen::MatrixXd &  dW,
const Eigen::VectorXd &  db,
double  lr 
)
noexcept

SGD update: W -= lr*dW, b -= lr*db.

◆ weights()

const Eigen::MatrixXd & FlexNN::Layers::Dense::weights ( ) const
inlinenoexcept

The documentation for this class was generated from the following files: