// Original python code
// https://iamtrask.github.io/2015/07/12/basic-python-network/
// Neural Network = 3 inputs, 4 hidden, 1 output with sigmoid activation
use ndarray::{array, Array};
use ndarray_rand::{rand::SeedableRng, rand_distr::Uniform, RandomExt}; // random matrix generation
use rand_isaac::isaac64::Isaac64Rng; // for setting seed
fn main() -> std::io::Result<()> {
// set seeds
let seed = 42;
let mut rng = Isaac64Rng::seed_from_u64(seed);
// dataset
let x = array![[0., 0., 1.], [0., 1., 1.], [1., 0., 1.], [1., 1., 1.]];
let y = array![[0., 1., 1., 0.]].reversed_axes();
// initializing random weights
let mut w0 = Array::random_using((3, 4), Uniform::new(0., 1.), &mut rng); // syn0
let mut w1 = Array::random_using((4, 1), Uniform::new(0., 1.), &mut rng); // syn1
for i in 0..1001 {
// forward propagation
let hidden = -x.dot(&w0); // l1
let hidden = 1. / (1. + (hidden.mapv(f64::exp)));
let output = -hidden.dot(&w1); // l2
let output = 1. / (1. + (output.mapv(f64::exp)));
// gradient calculation
let output_delta = (&y - &output) * (output.clone() * (1. - &output)); // l2_delta
let hidden_delta = output_delta.dot(&w1.t()) * (hidden.clone() * (1. - &hidden)); // l1_delta
// update weights
w1 = &w1 + &hidden.t().dot(&output_delta);
w0 = &w0 + &x.t().dot(&hidden_delta);
if i % 100 == 0 {
println!("Epoch: {} \n {:?}\n", i,output);
}
}
Ok(())
}
Iced:是跨平臺的 Rust GUI 庫
https://cryptowat.ch/apps/desktop博客:Rust 生命周期https://blog.thoughtram.io/lifetimes-in-rust/視頻:STM32 Rust 系列教程https://www.youtube.com/playlist?list=PLDWmoWFf46givBRQmh5DyE27OsXMJPfagRust Careers : Rust 招聘網站https://rust.careers/