35 个版本 (6 个稳定版)
2.0.0-rc3 | 2021 年 11 月 28 日 |
---|---|
1.1.1 | 2021 年 11 月 7 日 |
1.1.0 | 2020 年 12 月 31 日 |
1.0.2 | 2020 年 8 月 7 日 |
0.6.1 | 2017 年 11 月 25 日 |
#158 in 机器学习
用于 ast_topology
445KB
11K SLoC
autograd
由 ndarray 支持的张量和可微分操作。
Cargo.toml
如果你使用基本的线性代数操作,尤其是矩阵乘法,启用 blas
功能将有助于提高速度。
[dependencies]
autograd = {"<version>", features = ["blas", "<blas-implementation-choice>"] }
blas-implementation-choice
必须是以下之一(也参见 blas-src)
accelerate
仅限 macOSintel-mkl
仅限 Intel/AMD CPU。包括向量数学 (VM) 操作openblas
功能
使用懒张量进行反向模式的自动微分
这里我们只是在计算 z = 2x^2 + 3y + 1
的偏导数。
use autograd as ag;
use ag::tensor_ops::*;
ag::run(|ctx: &mut ag::Context<_>| {
let x = ctx.placeholder("x", &[]);
let y = ctx.placeholder("y", &[]);
let z = 2.*x*x + 3.*y + 1.;
// dz/dy
let gy = &grad(&[z], &[y])[0];
println!("{:?}", gy.eval(ctx)); // => Ok(3.)
// dz/dx (requires to fill the placeholder `x`)
let gx = &grad(&[z], &[x])[0];
let feed = ag::ndarray::arr0(2.);
println!("{:?}", ctx.evaluator().push(gx).feed(x, feed.view()).run()[0]); // => Ok(8.)
// ddz/dx (differentiates `z` again)
let ggx = &grad(&[gx], &[x])[0];
println!("{:?}", ggx.eval(ctx)); // => Ok(4.)
});
神经网络
该软件包具有各种由 tensorflow/theano 启发的基本功能,用于训练神经网络。由于计算图只需要最少的堆分配,因此即使对于复杂的网络,开销也很小。
// MNIST digits classification with multi-layer-perceptron
use autograd as ag;
use ag::optimizers::adam::Adam;
use ag::tensor_ops::*;
use ag::prelude::*;
let mut env = ag::VariableEnvironment::new();
let rng = ag::ndarray_ext::ArrayRng::<f32>::default();
// Register variables in this env.
env.name("w").set(rng.glorot_uniform(&[28 * 28, 10]));
env.name("b").set(ag::ndarray_ext::zeros(&[1, 10]));
let adam = Adam::default("my_adam", env.default_namespace().current_var_ids(), &mut env);
for epoch in 0..3 { // 0.11 sec/epoch on 2.7GHz Intel Core i5
env.run(|ctx| {
let x = ctx.placeholder("x", &[-1, 28*28]);
let y = ctx.placeholder("y", &[-1]);
let w = ctx.variable("w");
let b = ctx.variable("b");
let z = matmul(x, w) + b;
let mean_loss = reduce_mean(sparse_softmax_cross_entropy(z, &y), &[0], false);
let grads = &grad(&[mean_loss], &[w, b]);
// let mut feeder = ag::Feeder::new();
// feeder.push(x, x_batch).push(y, y_batch);
// adam.update(&[w, b], grads, ctx, feeder);
});
}
抽象
use autograd as ag;
use ag::tensor_ops::*;
use ag::ndarray;
// `Tensor::map()`
ag::run(|ctx| {
let x = ones(&[2, 3], ctx);
// apply ndarray's methods
let y = x.map(|x| x.fold_axis(ndarray::Axis(0), 0.0, |acc, x| acc + x));
let z = x.map(|x| ag::ndarray_ext::zeros(x.shape()));
});
// Hooks
ag::run(|ctx| {
let x: ag::Tensor<f32> = ones(&[2, 3], ctx).show_shape();
let y: ag::Tensor<f32> = ones(&[2, 3], ctx).raw_hook(|x| println!("{}", x));
});
依赖项
~4.5–7MB
~130K SLoC