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
每月下载量 57
在 3 crates 中使用
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