#machine-learning #convolution #image #pytorch #compatible #neural #neural-network

convolutions-rs

快速、最小依赖、完全使用 Rust 实现的机器学习卷积库

10 个版本

0.3.4 2022年4月18日
0.3.3 2022年4月18日
0.3.1 2022年3月22日
0.2.3 2022年3月21日
0.1.0 2021年10月13日

机器学习 中排名 #319

Download history 35/week @ 2024-03-31 9/week @ 2024-04-07 9/week @ 2024-04-14 14/week @ 2024-04-21 13/week @ 2024-04-28 14/week @ 2024-05-05 14/week @ 2024-05-12 18/week @ 2024-05-19 13/week @ 2024-05-26 22/week @ 2024-06-02 30/week @ 2024-06-09 29/week @ 2024-06-16 17/week @ 2024-06-23 1/week @ 2024-06-30 7/week @ 2024-07-07

每月下载量 57
3 crates 中使用

MIT 许可证

4.5MB
584

convolutions-rs

convolutions-rs 是一个 crate,它提供了一个快速、经过充分测试的机器学习卷积库,完全使用 Rust 编写,依赖性最小。特别是,这是第一个完全不依赖本地 C 库的卷积 crate。我们提供了转置卷积(也称为反卷积)以及普通卷积。

该 crate 在 ZipNet 项目(https://github.com/Conzel/zipnet)的过程中开发,我们需要一个无 C 实现的卷积来将我们的代码编译为 WebASM。

特性

  • 最小依赖,特别是没有 C 依赖
  • 通过随机生成的单元测试进行了广泛测试
  • 100% 与 Pytorch 实现兼容
  • 泛型以确保流畅的使用
  • 通过基准测试验证了速度

目前,这个 crate 在小图像上的速度与 Pytorch 相当,但在大图像和中图像上会有明显的减慢(需要 ~20-50 倍的时间)。我们仍然足够快,可以用于研究/示例应用,但我们的目标是提高速度,使其接近 PyTorch。基准测试可以在 https://github.com/Conzel/convolutions-rs-benchmarks/ 找到。

此外,转置卷积目前相对较慢。我们正在努力解决这个问题。

与实现兼容性

如上所述,我们与 Pytorch 实现完全兼容。这并不意味着我们支持 Pytorch 的所有操作,但我们支持的所有操作在 Pytorch 中都有相同的输出。这通过随机数组测试得到了验证。

PyTorch和Tensorflow的实现大部分是一致的。我们发现唯一一个它们有时不一致的情况是same填充,因为可能存在不同的实现策略。对于步长为1的情况,这不会成为问题,但步长大于1时会导致数组值不同。

有关进一步讨论,请参阅此处: https://stackoverflow.com/questions/52975843/comparing-conv2d-with-padding-between-tensorflow-and-pytorch

用法

如前所述,此包提供了正常的卷积以及转置卷积。我们以免费函数和类似神经网络层的形式提供这两种卷积。此crate使用函数时也需要ndarray,因为输入和输出都是以ndarray的形式。

示例

use convolutions_rs::convolutions::*;
use ndarray::*;
use convolutions_rs::Padding;

// Input has shape (channels, height, width)
let input = Array::from_shape_vec(
    (1, 4, 4),
    vec![1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.]
)
.unwrap();

// Kernel has shape (channels out, channels in, height, width)
let kernel: Array4<f32> = Array::from_shape_vec(
    (2,1,2,2),
    vec![1.,1.,1.,1.,1.,1.,1.,1.]
)
.unwrap();

let conv_layer = ConvolutionLayer::new(kernel.clone(), 1, Padding::Valid);
let output_layer: Array3<f32> = conv_layer.convolve(&input);
let output_free = conv2d(&kernel, &input, Padding::Valid, 1);

println!("Layer: {:?}", output_layer);
println!("Free: {:?}", output_free);

依赖项

约5MB
约94K SLoC