1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use microtensor::{prelude::*, Tensor, Variable};
fn dense_layer(input: &Variable<f32>, size: usize) -> Variable<f32> {
let weights = (Tensor::randn(&[input.shape()[-1], size]) / size as f32).trained();
let bias = Tensor::zeros(&[size]).trained();
input.mm(&weights) + bias
}
fn perceptron(input: &Variable<f32>) -> Variable<f32> {
let output = dense_layer(input, 16).relu();
dense_layer(&output, 10).sigmoid()
}
fn main() {
let image_input = Tensor::zeros(&[32, 28 * 28]).tracked();
let output = perceptron(&image_input);
let label_input = Tensor::zeros(&[32, 10]).tracked();
let loss = (&label_input - &output).sqr().mean(0);
let learning_rate = 0.01;
for _ in 0..100 {
let images = Tensor::ones(&[32, 28 * 28]).tracked();
let labels = (Tensor::rand(&[32]) * 10.0).cast::<u8>().one_hot(10);
image_input.feed(&images);
label_input.feed(&labels);
loss.forward();
loss.backward();
for mut param in loss.parameters() {
param -= param.grad().unwrap() * learning_rate
}
loss.reset();
}
}