#![cfg(feature = "neural_network")]
use approx::assert_relative_eq;
use ndarray::{Array, IxDyn};
use rustyml::neural_network::layer::pooling_layer::global_average_pooling_2d::GlobalAveragePooling2D;
use rustyml::neural_network::loss_function::mean_squared_error::MeanSquaredError;
use rustyml::neural_network::optimizer::sgd::SGD;
use rustyml::neural_network::sequential::Sequential;
#[test]
fn test_global_average_pooling_2d() {
let input = Array::from_elem(IxDyn(&[2, 3, 4, 4]), 1.0);
let mut model = Sequential::new();
model
.add(GlobalAveragePooling2D::new())
.compile(SGD::new(0.01).unwrap(), MeanSquaredError::new());
model.summary();
let output = model.predict(&input).unwrap();
assert_eq!(output.shape(), &[2, 3]);
for b in 0..2 {
for c in 0..3 {
assert_relative_eq!(output[[b, c]], 1.0);
}
}
let mut varied_input = Array::from_elem(IxDyn(&[1, 2, 2, 2]), 0.0);
varied_input[[0, 0, 0, 0]] = 1.0;
varied_input[[0, 0, 0, 1]] = 2.0;
varied_input[[0, 0, 1, 0]] = 3.0;
varied_input[[0, 0, 1, 1]] = 4.0;
varied_input[[0, 1, 0, 0]] = 5.0;
varied_input[[0, 1, 0, 1]] = 6.0;
varied_input[[0, 1, 1, 0]] = 7.0;
varied_input[[0, 1, 1, 1]] = 8.0;
let mut model = Sequential::new();
model.add(GlobalAveragePooling2D::new());
let varied_output = model.predict(&varied_input).unwrap();
assert_eq!(varied_output.shape(), &[1, 2]);
assert_relative_eq!(varied_output[[0, 0]], 2.5);
assert_relative_eq!(varied_output[[0, 1]], 6.5);
}