pub struct AdaptiveAvgPool2D<F: Float + Debug + Send + Sync> { /* private fields */ }
Expand description
Adaptive Average Pooling 2D layer
Applies average pooling with adaptive output size. The output size is specified, and the pooling kernel size and stride are computed automatically.
§Examples
use scirs2_neural::layers::{AdaptiveAvgPool2D, Layer};
use ndarray::{Array, Array4};
// Create an adaptive average pooling layer with output size 7x7
let pool = AdaptiveAvgPool2D::new((7, 7), Some("adaptive_pool")).unwrap();
// Forward pass with a batch of 2 samples, each with 3 channels and size 32x32
let batch_size = 2;
let channels = 3;
let height = 32;
let width = 32;
let input = Array4::<f64>::from_elem((batch_size, channels, height, width), 0.1).into_dyn();
let output = pool.forward(&input).unwrap();
// Output should have dimensions [batch_size, channels, 7, 7]
assert_eq!(output.shape(), &[batch_size, channels, 7, 7]);
Implementations§
Source§impl<F: Float + Debug + ScalarOperand + Send + Sync + 'static> AdaptiveAvgPool2D<F>
impl<F: Float + Debug + ScalarOperand + Send + Sync + 'static> AdaptiveAvgPool2D<F>
Sourcepub fn new(output_size: (usize, usize), name: Option<&str>) -> Result<Self>
pub fn new(output_size: (usize, usize), name: Option<&str>) -> Result<Self>
Create a new adaptive average pooling layer
§Arguments
output_size
- Desired output spatial size (height, width)name
- Optional name for the layer
§Returns
- A new adaptive average pooling layer
Examples found in repository?
examples/new_features_showcase.rs (line 43)
33fn demonstrate_adaptive_pooling() -> Result<(), Box<dyn std::error::Error>> {
34 println!("🔧 Adaptive Pooling Layers Demonstration");
35 println!("========================================\n");
36
37 // Create input tensor: batch_size=2, channels=3, height=32, width=32
38 let input = Array4::<f64>::from_elem((2, 3, 32, 32), 1.5);
39 println!("Input shape: {:?}", input.shape());
40
41 // Adaptive Average Pooling to 7x7
42 println!("\n1. Adaptive Average Pooling (32x32 → 7x7):");
43 let adaptive_avg_pool = AdaptiveAvgPool2D::new((7, 7), Some("adaptive_avg_7x7"))?;
44 let avg_output = adaptive_avg_pool.forward(&input.clone().into_dyn())?;
45 println!(" Output shape: {:?}", avg_output.shape());
46 println!(
47 " Layer description: {}",
48 adaptive_avg_pool.layer_description()
49 );
50
51 // Adaptive Max Pooling to 4x4
52 println!("\n2. Adaptive Max Pooling (32x32 → 4x4):");
53 let adaptive_max_pool = AdaptiveMaxPool2D::new((4, 4), Some("adaptive_max_4x4"))?;
54 let max_output = adaptive_max_pool.forward(&input.into_dyn())?;
55 println!(" Output shape: {:?}", max_output.shape());
56 println!(
57 " Layer description: {}",
58 adaptive_max_pool.layer_description()
59 );
60
61 // Non-square adaptive pooling
62 println!("\n3. Non-square Adaptive Pooling (32x32 → 3x5):");
63 let non_square_pool = AdaptiveAvgPool2D::new((3, 5), Some("non_square"))?;
64 let non_square_output =
65 non_square_pool.forward(&Array4::<f64>::from_elem((1, 2, 16, 20), 2.0).into_dyn())?;
66 println!(" Input shape: [1, 2, 16, 20]");
67 println!(" Output shape: {:?}", non_square_output.shape());
68
69 println!("✅ Adaptive pooling demonstration completed!\n");
70 Ok(())
71}
Trait Implementations§
Source§impl<F: Float + Debug + ScalarOperand + Send + Sync + 'static> Layer<F> for AdaptiveAvgPool2D<F>
impl<F: Float + Debug + ScalarOperand + Send + Sync + 'static> Layer<F> for AdaptiveAvgPool2D<F>
Source§fn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
Get the layer as a mutable dyn Any for downcasting Read more
Source§fn forward(&self, input: &Array<F, IxDyn>) -> Result<Array<F, IxDyn>>
fn forward(&self, input: &Array<F, IxDyn>) -> Result<Array<F, IxDyn>>
Forward pass of the layer Read more
Source§fn backward(
&self,
_input: &Array<F, IxDyn>,
grad_output: &Array<F, IxDyn>,
) -> Result<Array<F, IxDyn>>
fn backward( &self, _input: &Array<F, IxDyn>, grad_output: &Array<F, IxDyn>, ) -> Result<Array<F, IxDyn>>
Backward pass of the layer to compute gradients Read more
Source§fn update(&mut self, _learning_rate: F) -> Result<()>
fn update(&mut self, _learning_rate: F) -> Result<()>
Update the layer parameters with the given gradients Read more
Source§fn layer_type(&self) -> &str
fn layer_type(&self) -> &str
Get the type of the layer (e.g., “Dense”, “Conv2D”) Read more
Source§fn parameter_count(&self) -> usize
fn parameter_count(&self) -> usize
Get the number of trainable parameters in this layer Read more
Source§fn layer_description(&self) -> String
fn layer_description(&self) -> String
Get a detailed description of this layer Read more
Source§fn gradients(&self) -> Vec<Array<F, IxDyn>> ⓘ
fn gradients(&self) -> Vec<Array<F, IxDyn>> ⓘ
Get the gradients of the layer parameters Read more
Source§fn set_gradients(&mut self, _gradients: &[Array<F, IxDyn>]) -> Result<()>
fn set_gradients(&mut self, _gradients: &[Array<F, IxDyn>]) -> Result<()>
Set the gradients of the layer parameters Read more
Source§fn set_params(&mut self, _params: &[Array<F, IxDyn>]) -> Result<()>
fn set_params(&mut self, _params: &[Array<F, IxDyn>]) -> Result<()>
Set the parameters of the layer Read more
Source§fn set_training(&mut self, _training: bool)
fn set_training(&mut self, _training: bool)
Set the layer to training mode (true) or evaluation mode (false) Read more
Source§fn is_training(&self) -> bool
fn is_training(&self) -> bool
Get the current training mode Read more
Auto Trait Implementations§
impl<F> Freeze for AdaptiveAvgPool2D<F>
impl<F> RefUnwindSafe for AdaptiveAvgPool2D<F>where
F: RefUnwindSafe,
impl<F> Send for AdaptiveAvgPool2D<F>
impl<F> Sync for AdaptiveAvgPool2D<F>
impl<F> Unpin for AdaptiveAvgPool2D<F>where
F: Unpin,
impl<F> UnwindSafe for AdaptiveAvgPool2D<F>where
F: UnwindSafe,
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
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more