C++用于机器学习:实际应用与局限性

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++用于机器学习:实践中的优势与局限

\n\n

当谈到机器学习时,大多数开发者首先想到的是Python及其PyTorch、TensorFlow和scikit-learn生态系统。然而,C++在对速度、低延迟和内存控制要求苛刻的生产系统中仍然是不可或缺的工具。在本文中,我们将探讨如何在实际中使用C++进行机器学习,它的优势所在,以及它在哪些方面不如Python。

\n\n

为什么C++在ML领域仍然重要?

\n

Python在研究和原型设计方面占主导地位,但C++是几乎所有流行ML框架(TensorFlow、PyTorch、XGBoost)核心的编写语言。如果你需要:

\n
    \n
  • 在嵌入式设备(物联网、机器人技术)上部署模型;
  • \n
  • 实时处理数据(自动驾驶、交易系统);
  • \n
  • 在没有解释器开销的情况下实现最大性能;
  • \n
  • 将ML集成到现有的C++代码中(游戏、CAD、模拟器),
  • \n
\n

那么C++不仅是一种替代方案,而是唯一的选择。

\n\n

C++用于ML的实际能力

\n\n

1. 线性代数运算(Eigen)

\n

任何ML的基础都是矩阵运算。在C++中,这通过Eigen库实现。它提供了接近手动优化的性能,同时拥有便捷的语法。

\n
#include <Eigen/Dense>\n#include <iostream>\n\nint main() {\n    // 创建矩阵\n    Eigen::MatrixXd X(3, 2);\n    X << 1, 2,\n          3, 4,\n          5, 6;\n    Eigen::VectorXd y(3);\n    y << 2, 4, 6;\n\n    // 解决最小二乘问题:w = (X^T X)^{-1} X^T y\n    Eigen::VectorXd w = (X.transpose() * X).ldlt().solve(X.transpose() * y);\n    std::cout << "模型权重: " << w.transpose() << std::endl;\n    return 0;\n}
\n

这段代码无需任何循环即可计算线性回归——Eigen在底层使用了向量化和多线程技术。

\n\n

2. 使用Dlib进行经典ML

\n

Dlib是少数提供现成算法的C++库之一:SVM、K近邻、决策树甚至深度学习。

\n
#include <dlib/svm.h>\n#include <dlib/rand.h>\n#include <iostream>\n\nint main() {\n    using sample_type = dlib::matrix<double, 2, 1>;\n    std::vector<sample_type> samples;\n    std::vector<double> labels;\n\n    // 生成合成数据\n    dlib::rand rnd;\n    for (int i = 0; i < 100; ++i) {\n        sample_type s;\n        s(0) = rnd.get_random_double();\n        s(1) = rnd.get_random_double();\n        samples.push_back(s);\n        labels.push_back(s(0) + s(1) > 1.0 ? 1.0 : -1.0);\n    }\n\n    // 使用RBF核训练SVM\n    dlib::svm_c_ekm_trainer<dlib::kernel_type> trainer;\n    trainer.set_kernel(dlib::radial_basis_kernel<sample_type>(0.1));\n    auto decision_function = trainer.train(samples, labels);\n\n    // 测试\n    sample_type test = {0.8, 0.7};\n    std::cout << "预测结果: " << decision_function(test) << std::endl;\n    return 0;\n}
\n

Dlib支持模型序列化,允许保存训练好的模型并在生产环境中加载。

\n\n

3. 无需Python的神经网络推理

\n

要在C++中运行已训练的模型,请使用ONNX Runtime或TensorFlow C++ API。加载ONNX模型的示例:

\n
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>\n#include <vector>\n\nint main() {\n    Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");\n    Ort::SessionOptions session_options;\n    Ort::Session session(env, "model.onnx", session_options);\n\n    // 准备输入数据(以3x224x224图像为例)\n    std::vector<float> input_tensor_values(3 * 224 * 224, 0.0f);\n    std::vector&l                

博客

书籍推荐