minidx 0.1.10

Simple, compile-time-sized neural networks.
Documentation
use minidx::prelude::*;
use minidx::problem::Problem;
use rand::rngs::SmallRng;
use rand::SeedableRng;

#[test]
#[ignore]
fn integration_modular_addition10() {
    use minidx::problem::ModularAddition10;

    let network = (
        (
            layers::LRDiv::<f32, 20, 2, layers::Linear<20, 35>>::default(),
            layers::Sigmoid,
        ),
        layers::Linear::<35, 10>::default(),
        layers::Softmax::default(),
    );

    let mut nn = Buildable::<f32>::build(&network);

    let mut rng = SmallRng::seed_from_u64(456645);
    nn.rand_params(&mut rng, 1.0).unwrap();

    let mut problem = ModularAddition10::new(rng);

    use minidx_core::loss::LogitLoss;
    let mut updater = nn.new_rmsprop_with_momentum(TrainParams::with_lr(2.0e-2), 0.85, 0.8);
    for _i in 0..5000 {
        train_batch(
            &mut updater,
            &mut nn,
            |got, want| (got.logit_bce(want), got.logit_bce_input_grads(want)),
            &mut || problem.sample(),
            5,
        );
    }

    for _ in 0..30 {
        let (input, target) = problem.sample();
        let out = nn.forward(&input).unwrap();
        let loss = out.logit_bce(&target);
        println!(
            "input={:?}: got={:?}, want={:?}: loss={}",
            input, out, target, loss
        );
        assert!(loss < 0.1);
    }
}

#[test]
#[ignore]
fn integration_modular_addition32() {
    use minidx::problem::ModularAddition32;

    let network = (
        (layers::Linear::<64, 64> {}, layers::Sigmoid),
        layers::Linear::<64, 32> {},
        layers::Softmax::default(),
    );

    let mut nn = Buildable::<f32>::build(&network);

    let mut rng = SmallRng::seed_from_u64(345643);
    nn.rand_params(&mut rng, 1.0).unwrap();

    let mut problem = ModularAddition32::new(rng);

    use minidx_core::loss::LogitLoss;
    let mut updater = nn.new_rmsprop_with_momentum(TrainParams::with_lr(2.0e-2), 0.9, 0.9);
    for _i in 0..42000 {
        train_batch(
            &mut updater,
            &mut nn,
            |got, want| (got.logit_bce(want), got.logit_bce_input_grads(want)),
            &mut || problem.sample(),
            5,
        );
    }

    for _ in 0..30 {
        let (input, target) = problem.sample();
        let out = nn.forward(&input).unwrap();
        let loss = out.logit_bce(&target);
        println!(
            "input={:?}: got={:?}, want={:?}: loss={}",
            input, out, target, loss
        );
        assert!(loss < 0.1);
    }
}