use flashlight_tensor::tensor::Tensor;
use crate::layers::LayerCpu;
pub struct Sigmoid{
input_cache: Vec<Tensor<f32>>,
}
impl Sigmoid{
pub fn new() -> Self{
Self{
input_cache: Vec::new(),
}
}
pub fn grad_output(&self, target: &Tensor<f32>) -> Tensor<f32>{
if self.input_cache.is_empty(){
panic!();
}
let sigmoid_out = self.input_cache.last().unwrap().sigmoid();
sigmoid_out.tens_sub(target).unwrap()
}
}
impl LayerCpu for Sigmoid{
fn forward(&mut self, input: &Tensor<f32>) -> Tensor<f32> {
self.input_cache.push(input.clone());
input.sigmoid()
}
fn backward(&mut self, grad_output: &Tensor<f32>) -> Tensor<f32> {
if self.input_cache.is_empty(){
panic!();
}
self.input_cache.pop().unwrap().sigmoid_der().tens_broadcast_mul(grad_output).unwrap()
}
}