pub struct Layer { /* private fields */ }Expand description
A dense layer: y = activation(Wx + b).
Weights use row-major layout with shape (out_dim, in_dim).
Implementations§
Source§impl Layer
impl Layer
Sourcepub fn activation(&self) -> Activation
pub fn activation(&self) -> Activation
Returns this layer’s activation.
Source§impl Layer
impl Layer
pub fn new_with_rng<R: Rng + ?Sized>( in_dim: usize, out_dim: usize, init: Init, activation: Activation, rng: &mut R, ) -> Result<Self>
Sourcepub fn forward(&self, inputs: &[f32], outputs: &mut [f32])
pub fn forward(&self, inputs: &[f32], outputs: &mut [f32])
Forward pass for a single sample.
Computes:
z = W * inputs + boutputs = activation(z)
Shape contract:
inputs.len() == self.in_dimoutputs.len() == self.out_dim
Sourcepub fn backward(
&self,
inputs: &[f32],
outputs: &[f32],
d_outputs: &[f32],
d_inputs: &mut [f32],
d_weights: &mut [f32],
d_biases: &mut [f32],
)
pub fn backward( &self, inputs: &[f32], outputs: &[f32], d_outputs: &[f32], d_inputs: &mut [f32], d_weights: &mut [f32], d_biases: &mut [f32], )
Backward pass for a single sample.
This uses overwrite semantics:
d_inputsis overwritten (and internally zeroed before accumulation)d_weightsis overwrittend_biasesis overwritten
Inputs:
inputs: the same inputs passed toforwardoutputs: the outputs previously produced byforward(post-activation)d_outputs: upstream gradient dL/d(outputs)
Shape contract:
inputs.len() == self.in_dimoutputs.len() == self.out_dimd_outputs.len() == self.out_dimd_inputs.len() == self.in_dimd_weights.len() == self.weights.len()d_biases.len() == self.out_dim
Sourcepub fn backward_accumulate(
&self,
inputs: &[f32],
outputs: &[f32],
d_outputs: &[f32],
d_inputs: &mut [f32],
d_weights: &mut [f32],
d_biases: &mut [f32],
)
pub fn backward_accumulate( &self, inputs: &[f32], outputs: &[f32], d_outputs: &[f32], d_inputs: &mut [f32], d_weights: &mut [f32], d_biases: &mut [f32], )
Backward pass for a single sample (parameter accumulation semantics).
This is identical to backward except that parameter gradients are accumulated:
d_inputsis overwritten (and internally zeroed before accumulation)d_weightsis accumulated into (+=)d_biasesis accumulated into (+=)
This is useful for mini-batch training where you sum gradients over multiple samples.
Shape contract:
inputs.len() == self.in_dimoutputs.len() == self.out_dimd_outputs.len() == self.out_dimd_inputs.len() == self.in_dimd_weights.len() == self.weights.len()d_biases.len() == self.out_dim
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Layer
impl RefUnwindSafe for Layer
impl Send for Layer
impl Sync for Layer
impl Unpin for Layer
impl UnwindSafe for Layer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more