3 个不稳定版本

0.1.1 2024 年 6 月 30 日
0.1.0 2024 年 6 月 30 日
0.0.1 2023 年 9 月 24 日

#127 in 机器学习

自定义许可证

180KB
4K SLoC

Rust 3.5K SLoC // 0.1% comments Python 617 SLoC // 0.1% comments

Rust 中的 CVNN 库!

概述

一个用 Rust 构建的库,能够建模复值神经网络。

它目前还处于开发初期,但已经可以用来构建和训练基于多层感知器和卷积神经网络的架构。

用法

将库添加到你的 rust 项目的 Cargo.toml

[dependencies]
renplex = "0.1.0"

初始化一层

通过指定计算的精度、输入特征和输出特征的数目、初始化方法和激活函数来初始化一个可训练层。

use renplex::math::Complex;
use renplex::math::cfloat::Cf32;
use renplex::input::IOShape;
use renplex::init::InitMethod;
use renplex::act::ComplexActFunc;
use renplex::cvnn::layer::dense::DenseCLayer;

let ref mut seed: &mut u128 = 63478262957;

// define complex number with 64bits (precision)
// 32 bits for each real and imaginary part
type Precision = Cf32;

// number of scalar input features
let ni = 64;
// number of scalar output features (number of units)
let no = 16;

// input features are scalars (vetor of values)
// in the case of a 2D conv is input features are matrices (vector of matrices)
let input_shape = IOShape::Scalar(ni);
// initialization method
let init_method = InitMethod::XavierGlorotU(ni + no);
// complex activation function
let act_func = ComplexActFunc::RITSigmoid;


let dense_layer: DenseCLayer<Precision> = DenseCLayer::init(
  input_shape, 
  no,
  act_func,
  init_method,
  seed
).unwrap();

创建网络并添加层

通过定义输入层和随后的隐藏层来向前馈网络结构添加层。

use renplex::math::Complex;
use renplex::math::cfloat::Cf32;
use renplex::opt::ComplexLossFunc;	
use renplex::cvnn::layer::CLayer;
use renplex::cvnn::network::CNetwork;

let mut network: CNetwork<Cf32> = CNetwork::new();

// layers need to be wrapped for a common CLayer<T> interface
network.add_input(dense_input_layer.wrap()).unwrap();
network.add(dense_layer.wrap()).unwrap();

构建您的数据批

Renplex 提供了一个简单的数据集接口,用于构建包含独立变量和因变量的数据批。

use renplex::math::Complex;
use renplex::math::cfloat::Cf32;
use renplex::dataset::Dataset;

// independent variable type
type XFeatures = Cf32;
// dependent variable type
type YFeatures = Cf32; 

// initialize a batch of data
let mut data_batch: Dataset<XFeatures, YFeatures> = Dataset::new();
// extract a unique batch of data points
// can be done in any logic (default order, randomized, ...)
for _ in 0..batch_size {
  // collect data points from a file
  let x = ...;
  let y = ...;
  let data_point = (x, y);
  // add point to the dataset
  data_batch.add_point(data_point);
}

使用基于梯度的方法进行训练

使用完全复数反向传播算法计算性能指标并训练 CVNN。

use renplex::math::Complex;
use renplex::math::cfloat::Cf32;
use renplex::opt::ComplexLossFunction;

// define loss function
let loss_func = ComplexLossFuntion::Conventional;
// history of loss function values
let loss_vals = Vec::new();
// define a learning rate
let learning_rate = Cf32::new(1.0, 0.0);

// calculate the initial loss for the batch of data
let loss = network.loss(
  data_batch,
  &loss_func
).unwrap()
// add loss value to history
// (for optimization algorithms for instance)
loss_vals.push(loss);

// train 1 batch of data
network.gradient_opt(
  data_batch,
  &loss_func,
  learning_rate
).unwrap();

// this pipeline can be repeated to perform an epoch
// and repeated again for as many epochs choosen

执行预测和截获信号

在 CVNN 中正向传递信号并检查中间特征。

use renplex::input::IOType;

let input_point = IOType::Scalar(vec![0.22, 0.17, 0.13]);

// output of the networks
let prediction = network
  .foward(input_point)
  .unwrap();

// output features of the second layer of the network
let features = network
  .intercept(input_point, 2)
  .unwrap();

开发中的示例

在仓库中,有一个示例文件夹,包含 classification.rsregression.rs 文件,它们分别运行各自的管道。但是,classification.rs 需要在项目根目录中具有 MNIST 数据集。要运行示例代码,请在项目克隆后(在项目根目录中)使用以下命令:

cargo run --example <example>

也可以从 GitHub 下载每个文件,并将其作为依赖项运行在包含 Renplex 的项目中。

依赖项

~1.5MB
~25K SLoC