use crate::nn::{Linear, Module, ReLU};
use crate::tensor::Tensor;
use crate::error::Result;
pub struct FeedForward {
linear1: Linear,
relu: ReLU,
linear2: Linear,
}
impl FeedForward {
pub fn new(embed_dim: usize, hidden_dim: usize) -> Self {
Self {
linear1: Linear::new(embed_dim, hidden_dim),
relu: ReLU::new(),
linear2: Linear::new(hidden_dim, embed_dim),
}
}
}
impl Module for FeedForward {
fn forward(&self, inputs: &Tensor) -> Result<Tensor> {
let x = self.linear1.forward(inputs)?;
let x = self.relu.forward(&x)?;
let final_output = self.linear2.forward(&x)?;
Ok(final_output)
}
fn parameters(&self) -> Vec<Tensor> {
let mut params = Vec::new();
params.extend(self.linear1.parameters());
params.extend(self.linear2.parameters());
params
}
}