Rust与PyTorch实战:精选示例

发布于:2025-07-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

基于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);

更多示例方向

  1. 循环神经网络(RNN/LSTM)
  2. Transformer实现
  3. 生成对抗网络(GAN)
  4. 强化学习模型
  5. 模型量化与部署

完整代码库参考:

  • 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::