Rust与PyTorch实战:精选示例
基于Rust和PyTorch的实用
以下是基于Rust和PyTorch实用示例分类整理,涵盖基础操作、模型构建、训练与推理等场景。示例主要使用tch-rs
(Rust的PyTorch绑定库)实现。
基础张量操作
use tch::Tensor;// 创建张量
let tensor = Tensor::from_slice(&[1.0, 2.0, 3.0]);// 张量运算
let result = tensor * 2.0;// 索引操作
let slice = tensor.slice(0, 0, 3, 1);
线性回归模型
use tch::{nn, Tensor};struct LinearRegression {linear: nn::Linear,
}impl LinearRegression {fn new(vs: &nn::Path) -> Self {let linear = nn::linear(vs, 1, 1, Default::default());Self { linear }}fn forward(&self, xs: &Tensor) -> Tensor {self.linear.forward(xs)}
}
MNIST分类(全连接网络)
use tch::{nn, nn::Module, Device};struct Net {fc1: nn::Linear,fc2: nn::Linear,
}impl Net {fn new(vs: &nn::Path) -> Self {Self {fc1: nn::linear(vs, 784, 128, Default::default()),fc2: nn::linear(vs, 128, 10, Default::default()),}}
}impl Module for Net {fn forward(&self, xs: &Tensor) -> Tensor {xs.view([-1, 784]).apply(&self.fc1).relu().apply(&self.fc2)}
}
卷积神经网络(CNN)
struct CNN {conv1: nn::Conv2D,conv2: nn::Conv2D,fc1: nn::Linear,
}impl CNN {fn new(vs: &nn::Path) -> Self {Self {conv1: nn::conv2d(vs, 1, 32, 5, Default::default()),conv2: nn::conv2d(vs, 32, 64, 5, Default::default()),fc1: nn::linear(vs, 1024, 10, Default::default()),}}
}
保存与加载模型
// 保存
model.save("model.pt").unwrap();// 加载
let model = Net::new(&vs);
model.load("model.pt").unwrap();
GPU加速
let device = Device::cuda_if_available();
let tensor = Tensor::randn(&[2, 3], (Kind::Float, device));
自定义数据集加载
use tch::vision::Dataset;let dataset = Dataset::builder().data_path("data/").train(true).build();
优化器使用
let mut opt = nn::Adam::default().build(&vs, 1e-3).unwrap();
opt.backward_step(&loss);
更多示例方向
- 循环神经网络(RNN/LSTM)
- Transformer实现
- 生成对抗网络(GAN)
- 强化学习模型
- 模型量化与部署
完整代码库参考:
tch-rs
官方文档:https://docs.rs/tch/latest/tch/- GitHub示例:https://github.com/LaurentMazare/tch-rs/tree/main/examples
注意:运行前需安装libtorch并配置环境变量。建议通过Rust的bindgen
工具处理复杂模型接口。
AutoML-rs 自动化机器学习
AutoML-rs 是 Rust 生态中用于自动化机器学习(AutoML)的工具库,支持超参数优化、模型选择等任务。以下通过 20 个实例展示其核心功能,涵盖不同算法和优化场景。
示例 1: 使用随机搜索优化线性回归
use automl_rs::optimization::{RandomSearch, HyperparameterSpace};
use automl_rs::parameters::{ContinuousRange, CategoricalRange};let space = HyperparameterSpace::new().add_continuous("learning_rate", ContinuousRange::new(0.001, 0.1)).add_categorical("optimizer", CategoricalRange::new(&["sgd", "adam"]));let mut optim = RandomSearch::new(space);
let best_params = optim.optimize(|params| {// 模拟训练和评估逻辑let score = params.get_continuous("learning_rate").unwrap() * 0.5;score
});
示例 2: 贝叶斯优化支持向量机
use automl_rs::optimization::BayesianOptimization;let space = HyperparameterSpace::new().add_continuous("c", ContinuousRange::new(0.1, 10.0)).add_continuous("gamma", ContinuousRange::new(0.01, 1.0));let mut optim = BayesianOptimization::new(space);
let best = optim.optimize(|params| {let c = params.get_continuous("c").unwrap();let gamma = params.get_continuous("gamma").unwrap();1.0 / (c + gamma) // 模拟目标函数
});
示例 3: 网格搜索用于决策树深度
use automl_rs::optimization::GridSearch;let space = HyperparameterSpace::new().add_discrete("max_depth", vec![3, 5, 7, 10]);let mut optim = GridSearch::new(space);
let best = optim.optimize(|params| {let depth = params.get_discrete("max_depth").unwrap();depth as f64 * 0.2 // 模拟评分
});
示例 4: 遗传算法优化神经网络结构
use automl_rs::optimization::GeneticAlgorithm;let space = HyperparameterSpace::new().add_discrete("layers", vec![1, 2, 3]).add_continuous("dropout", ContinuousRange::new(0.1, 0.5));let mut optim = GeneticAlgorithm::new(space);
let best = optim.optimize(|params| {params.get_discrete("layers").unwrap() as f64 * 0.3
});
示例 5: 多目标优化(准确率与速度)
use automl_rs::optimization::{NSGA2, MultiObjective};let space = HyperparameterSpace::new().add_continuous("lr", ContinuousRange::new(0.001, 0.1));let mut optim = NSGA2::new(space);
let best = optim.optimize(|params| {let lr = params.get_continuous("lr").unwrap();MultiObjective::new(vec![lr, 1.0 / lr]) // 目标1: lr, 目标2: 1/lr
});
示例 6: 早停机制集成
use automl_rs::optimization::{RandomSearch, EarlyStopping};let space = HyperparameterSpace::new().add_continuous("param", ContinuousRange::new(0.0, 1.0));
let mut optim = RandomSearch::new(space).with_early_stopping(5); // 5次无改进则停止
let _ = optim.optimize(|params| params.get_continuous("param").unwrap());
示例 7: 自定义评估指标
use automl_rs::optimization::RandomSearch;let space = HyperparameterSpace::new().add_continuous("x", ContinuousRange::new(-10.0, 10.0));
let mut optim = RandomSearch::new(space);
let _ = optim.optimize(|params| {let x = params.get_continuous("x").unwrap();-x * x // 最大化负平方(模拟最小化平方)
});
示例 8: 并行化超参数搜索
use automl_rs::