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 中的 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.rs
和 regression.rs
文件,它们分别运行各自的管道。但是,classification.rs
需要在项目根目录中具有 MNIST 数据集。要运行示例代码,请在项目克隆后(在项目根目录中)使用以下命令:
cargo run --example <example>
也可以从 GitHub 下载每个文件,并将其作为依赖项运行在包含 Renplex 的项目中。
依赖项
~1.5MB
~25K SLoC