extern crate concision as cnc;
use cnc::ex::sample::TestModel;
use cnc::{ModelFeatures, Predict, StandardModelConfig, Train};
use ndarray::prelude::*;
fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt()
.with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env())
.with_max_level(tracing::Level::TRACE)
.with_target(false)
.with_timer(tracing_subscriber::fmt::time::uptime())
.init();
tracing::info!("Setting up the model...");
let features = ModelFeatures::deep(3, 9, 2, 6);
tracing::debug!("Model Features: {features:?}");
let mut config = StandardModelConfig::new()
.with_epochs(1000)
.with_batch_size(32);
config.set_learning_rate(0.01);
config.set_momentum(0.9);
config.set_decay(0.0001);
tracing::debug!("Model Config: {config:?}");
let mut model = TestModel::<f64>::new(config, features).init();
let input = Array1::linspace(1.0, 9.0, model.features().input());
let output = model.predict(&input);
tracing::info!("output: {:?}", output);
assert_eq!(output.dim(), (model.features().output()));
let training_input =
Array2::from_shape_vec((1, model.features().input()), input.to_vec()).unwrap();
let expected_output = Array2::from_elem((1, model.features().output()), 0.235);
let training_span = tracing::info_span!("Starting training...").entered();
for e in 0..model.config().epochs() {
training_span.in_scope(|| tracing::trace!("Training epoch {}...", e));
model.train(&training_input, &expected_output)?;
}
drop(training_span);
let output = model.predict(&input);
tracing::info!("output: {:?}", output);
Ok(())
}