use microtensor::{ prelude::*, Tensor, Graph };
fn main() {
let filename = "model.nn";
build_model(filename);
load_model(filename);
}
fn build_model(filename: &str) {
let x1 = Tensor::vec(&[1.0, 2.0]).tracked();
let x2 = Tensor::ones(&[16]).tracked();
let w = Tensor::randn(&[2, 16]).trained();
let y = x1.mm(&w);
let z = (&y * &x2).sum(0);
let graph = Graph::new(&[x1, x2], &[y, z]);
graph.save(filename).unwrap();
}
fn load_model(filename: &str) {
let graph = Graph::load(filename).unwrap();
graph.run(&[
&Tensor::vec(&[5.0, 6.0]).tracked(),
&Tensor::randn(&[16]).tracked(),
]);
let z = &graph.outputs[1];
println!("z is now {}", z.item());
let z = &graph.outputs[1];
z.backward();
for mut param in z.parameters() {
param -= param.grad().unwrap() * 0.01
}
}