1 个不稳定版本

0.0.1 2023 年 8 月 20 日

#13#dimensional

MIT 许可证

125KB
2.5K SLoC

Tenso-rs

tenso-rs 包提供了与 NumPy、PyTorch、TensorFlow、ndarray 包等类似的功能,用于处理 N 维张量。

这是一个玩具项目,旨在探索这些令人惊叹的库的工作原理。 这绝对不是用于探索或作为笑柄的。

亮点

  • 支持自定义类型的 N 维张量(目前 0 != N,即将推出 0 维张量)
  • 常见的张量创建方法,如 zeroslinespacearange 等。
  • 张量视图
  • 基本的张量操作方法,如 catreshapepermutetranspose 等。
  • 张量视图;张量切片;张量迭代器
  • 常见的数学运算,如 cosarctanhsqrtclamp
    • 少数“高级”函数,如 erfcsinclog_gamma

待办事项

我想尽快完成的事情

  • 用于用户数据的张量创建的“良好”宏
  • 零维张量
  • 原地张量操作
  • 广播
  • 更多张量操作方法(从 numpy API 文档
  • 更多数学运算(从 scipy 特殊函数
  • 使用 serde 保存和加载
  • 优化这段慢代码(源代码甚至没有进行基准测试)
  • 线性代数和张量乘法
  • 与 BLAS 和 matrixmultiply 包的集成/自定义代码
  • 等等。

示例

您可以使用(少数)创建方法创建新的张量,如下所示

// The following represents the tensor: [1, 2, 3, 4, 5, 6, 7, 8, 9]
let t1 = Tensor::<u128>::arange(1, 10, 1).unwrap();

// The following represents the tensor: [-10.0, -5.0, 0.0, 5.0, 10.0]
let t2 = Tensor::<f64>::linespace(-10.0, 10.0, 5).unwrap();

// The following represents the tensor: [[1, 0, 0], [0, 1, 0], [0, 0, 0]]
let t3 = Tensor::<i8>::eye(2, 3).unwrap();

// The following represents the tensor: [[1, 2, 3], [4, 5, 6]].
// As the TODOS mention, a nice macro for tensor from user data does not exist right now.
let t4 = Tensor::from_slice_and_dims(&[1, 2, 3, 4, 5, 6], &[2, 3]).unwrap();

// There are (a few) more!

张量的修改

let t1 = Tensor::from_slice_and_dims(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], &[3, 4]).unwrap();
let t2 = Tensor::from_slice_and_dims(&[13, 14, 15, 16, 17, 18], &[3, 2]).unwrap();
let res = t1.cat(&t2, 1).unwrap();
// res represents [[1, 2, 3, 4, 13, 14], [5, 6, 7, 8, 15, 16], [9, 10, 11, 12, 17, 18]]

let t = Tensor::<f64>::arange(0, 9, 1).unwrap();
let res = t.reshape(&[3, 3]).unwrap();
// res represents [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

let t = Tensor::arange(0, 24, 1).unwrap().reshape(&[2, 3, 4]).unwrap();
let res = t.permute(&[2, 0, 1]).unwrap();
// res represents [[[0, 4, 8], [12, 16, 20]], [[1, 5, 9], [13, 17, 21]], [[2, 6, 10], [14, 18, 22]], [[3, 7, 11], [15, 19, 23]]]

// There are (a few) more!

数学运算

let t = Tensor::logspace(f64::consts::E, 0.0, 5.0, 6).unwrap();
let res = t.cos();
// res represents [cos(0), cos(e), cos(e^2), cos(e^3), cos(e^4), cos(e^5)]

let t = Tensor::from_slice_and_dims(&[1.0, 4.0, 9.0, 16.0, 25.0], &[5]).unwrap();
let res = t.rsqrt();
// res represents [1, 1 / 2, 1 / 3, 1 / 4, 1 / 5]


let t = Tensor::arange(1.0, 6.0, 1.0).unwrap();
let res = t.gammaf();
// res represents [1.0, 1.0, 2.0, 6.0, 24.0, 120.0]

// There are (a few) more!

备注

  • 未测试:可以使用 num_bigint 进行任意精度计算
    • 注意:“高级”数学运算,如 erfgamma,目前还不是任意精度。
  • 欢迎提出新问题、拉取请求或提供想法!

依赖项

~0.7–1.2MB
~27K SLoC