C++ 中的深度学习框架实现

1. 引言

深度学习(Deep Learning)已经成为人工智能领域的核心技术,被广泛应用于计算机视觉、自然语言处理、自动驾驶等领域。然而,大多数深度学习框架,如 TensorFlow、PyTorch,主要以 Python 为主,但在高性能计算、嵌入式设备和生产环境中,C++ 深度学习框架 具有以下优势:

  • 高效执行:C++ 具有更快的计算速度,适用于 大规模推理任务
  • 低层次优化:可以直接控制 内存、计算图优化、GPU 加速
  • 嵌入式 & 工业应用:适用于 机器人、自动驾驶、边缘 AI 设备

本指南将介绍:
C++ 现有的深度学习框架(如 TensorFlow C++ API, PyTorch C++ API)
如何用 C++ 实现基础神经网络(手写神经网络 + 计算图)
C++ 深度学习框架的性能优化(多线程 + GPU 加速)
适用于生产环境的深度学习推理引擎(ONNX, TensorRT)


2. C++ 主要深度学习框架

目前,C++ 支持的深度学习框架主要包括:

框架 特点 适用场景
TensorFlow C++ API 支持训练 & 推理,可与 Python 互操作 大规模生产部署
PyTorch C++ API (LibTorch) 适用于 C++ 端的推理,训练支持较少 模型推理 & 部署
ONNX Runtime 兼容 TensorFlow/PyTorch/ONNX,跨平台 高效模型推理
Caffe 经典 CNN 框架,C++ 友好 图像识别 & 旧项目
TensorRT NVIDIA GPU 优化,推理速度极快 GPU 部署
Eigen/DLib 轻量级数学库,可实现自定义神经网络 小型 AI 项目

3. C++ 实现简单神经网络

我们先手写一个简单的神经网络(不依赖任何框架),以了解神经网络的基本原理。

3.1 神经网络架构

  • 输入层:接受数据(如图像像素)
  • 隐藏层:执行计算(矩阵乘法 + 激活函数)
  • 输出层:生成最终预测(Softmax)
#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>

using namespace std;

// Sigmoid 激活函数
double sigmoid(double x) {
    return 1.0 / (1.0 + exp(-x));
}

// 计算神经元输出
double neuron_output(const vector<double>& inputs, const vector<double>& weights, double bias) {
    double sum = bias;
    for (size_t i = 0; i < inputs.size(); i++) {
        sum += inputs[i] * weights[i];
    }
    return sigmoid(sum);
}

// 神经网络前向传播
vector<double> forward_pass(const vector<double>& inputs, const vector<vector<double>>& weights, const vector<double>& biases) {
    vector<double> outputs;
    for (size_t i = 0; i < weights.size(); i++) {
        outputs.push_back(neuron_output(inputs, weights[i], biases[i]));
    }
    return outputs;
}

int main() {
    // 初始化输入 & 权重 & 偏置
    vector<double> inputs = {0.5, 0.3};  // 输入数据
    vector<vector<double>> weights = {{0.8, 0.2}, {0.4, 0.9}}; // 2 个神经元
    vector<double> biases = {0.1, -0.3};

    vector<double> outputs = forward_pass(inputs, weights, biases);

    cout << "神经网络输出: ";
    for (double output : outputs) {
        cout << output << " ";
    }
    cout << endl;

    return 0;
}

运行示例

神经网络输出: 0.689974 0.645656

🔹 改进点

  • 增加 更多层数,让网络更深
  • 使用 ReLU 激活函数 提高非线性能力
  • 采用 梯度下降 进行训练

4. 使用 TensorFlow C++ API 进行推理

TensorFlow 提供 C++ API,可以加载已训练的模型进行推理。以下示例演示如何在 C++ 中加载 .pb 模型进行预测。

4.1 安装 TensorFlow C++ API

  1. 下载 TensorFlow C++ 预编译库:
    sudo apt-get install libtensorflow-dev
    
  2. 编写 CMakeLists.txt:
    cmake_minimum_required(VERSION 3.10)
    project(TensorFlowCPP)
    find_package(TensorFlow REQUIRED)
    add_executable(tf_inference main.cpp)
    target_link_libraries(tf_inference TensorFlow::TensorFlow)
    

4.2 C++ 加载 TensorFlow 模型

#include <tensorflow/core/public/session.h>
#include <tensorflow/core/platform/env.h>
#include <iostream>

using namespace tensorflow;
using namespace std;

int main() {
    // 加载 TensorFlow 模型
    Session* session;
    Status status = NewSession(SessionOptions(), &session);
    if (!status.ok()) {
        cerr << "无法创建 TensorFlow 会话: " << status.ToString() << endl;
        return 1;
    }

    GraphDef graph_def;
    status = ReadBinaryProto(Env::Default(), "model.pb", &graph_def);
    if (!status.ok()) {
        cerr << "加载模型失败: " << status.ToString() << endl;
        return 1;
    }

    status = session->Create(graph_def);
    if (!status.ok()) {
        cerr << "模型加载失败: " << status.ToString() << endl;
        return 1;
    }

    // 运行推理
    Tensor input(DT_FLOAT, TensorShape({1, 10}));  // 假设输入为 10 维向量
    auto input_map = input.flat<float>();
    for (int i = 0; i < 10; i++) {
        input_map(i) = 0.5;
    }

    vector<pair<string, Tensor>> inputs = {{"input_tensor", input}};
    vector<Tensor> outputs;

    status = session->Run(inputs, {"output_tensor"}, {}, &outputs);
    if (!status.ok()) {
        cerr << "推理失败: " << status.ToString() << endl;
        return 1;
    }

    cout << "预测结果: " << outputs[0].matrix<float>()(0, 0) << endl;

    session->Close();
    return 0;
}

适用场景

  • 生产环境 部署训练好的深度学习模型
  • 嵌入式系统、自动驾驶、边缘 AI 中进行高性能推理
  • C++ + TensorFlow 适用于 高并发大规模 AI 服务器

5. 使用 ONNX 进行跨框架推理

ONNX(Open Neural Network Exchange)允许在 C++ 中加载 TensorFlow / PyTorch / ONNX 训练的模型进行推理。

#include <onnxruntime/core/providers/cpu/cpu_provider_factory.h>
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>

int main() {
    Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "ONNXRuntime");
    Ort::Session session(env, "model.onnx", Ort::SessionOptions{nullptr});
    
    // 加载输入数据
    Ort::Value input_tensor = Ort::Value::CreateTensor<float>(
        memory_info, input_data, 10, input_shape.data(), input_shape.size());

    std::vector<Ort::Value> output_tensors = session.Run(
        Ort::RunOptions{nullptr}, input_names.data(), &input_tensor, 1, output_names.data(), 1);
    
    cout << "ONNX 预测结果: " << output_tensors[0].GetTensorMutableData<float>()[0] << endl;
    return 0;
}

优点

  • 支持 TensorFlow/PyTorch 训练的模型
  • 优化推理速度
  • 适用于 C++ 生产环境

6. 总结

🚀 C++ 深度学习关键技术
手写神经网络,理解核心原理
使用 TensorFlow C++ API 进行推理
ONNX 兼容多个框架,实现高效推理
高性能部署(CUDA、TensorRT)

💡 C++ 是深度学习工程化、工业级 AI 解决方案的最佳选择! 🎯🔥

更多推荐