35 个版本 (6 个稳定版)

2.0.0-rc32021 年 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

build Crates.io version docs.rs

ndarray 支持的张量和可微分操作。

Cargo.toml

如果你使用基本的线性代数操作,尤其是矩阵乘法,启用 blas 功能将有助于提高速度。

[dependencies]
autograd = {"<version>", features = ["blas", "<blas-implementation-choice>"] }

blas-implementation-choice 必须是以下之一(也参见 blas-src

  • accelerate 仅限 macOS
  • intel-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