配置条件:win11,clion c++,msvc 工具链,libtorch(pytorch 的c++接口),Release模式

cmakelists.txt设置

cmake_minimum_required(VERSION 4.0)
project(libtorchCPU)

set(CMAKE_CXX_STANDARD 20)

# ========== LibTorch 配置 ==========  CPU
set(CMAKE_PREFIX_PATH   G:/software/libtorch260_cpuRelease) # CPU  Release版本
set(torch_include1  G:/software/libtorch260_cpuRelease/include)
set(torch_include2  G:/software/libtorch260_cpuRelease/include/torch/csrc/api/include)
set(torch_lib   G:/software/libtorch260_cpuRelease/lib  )
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH})
find_package(Torch  REQUIRED)
include_directories(${torch_include1}  ${torch_include2} )
link_directories( ${torch_lib}   )

add_executable(LinearRegression LinearRegression.cpp)
# 在add_executable之后添加
# 复制主要的 torch DLL
add_custom_command(TARGET LinearRegression POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "G:/software/libtorch260_cpuRelease/lib/torch_cpu.dll" # GPU是torch_cuda.dll
        $<TARGET_FILE_DIR:LinearRegression>
)
# 复制 OpenMP DLL
add_custom_command(TARGET LinearRegression POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "G:/software/libtorch260_cpuRelease/lib/libiomp5md.dll"
        $<TARGET_FILE_DIR:LinearRegression>
)
add_custom_command(TARGET LinearRegression POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "G:/software/libtorch260_cpuRelease/lib/libiompstubs5md.dll"
        $<TARGET_FILE_DIR:LinearRegression>
)
# 复制其他可能需要的 DLL(可选,但建议)
add_custom_command(TARGET LinearRegression POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "G:/software/libtorch260_cpuRelease/lib/c10.dll" # GPU是c10_cuda.dll
        $<TARGET_FILE_DIR:LinearRegression>
)
target_link_libraries(LinearRegression "${TORCH_LIBRARIES}"  c10.lib c10.dll      torch.lib  torch_cpu.dll )  # c10_cuda.lib  torch_cuda.lib   torch_cuda.dll

测试代码

#include <torch/torch.h>
#include <iostream>
using namespace std;
using namespace torch;//用这个后 torch::nn::Module 就可以直接写成nn::Module,省去前面的 torch::
// 定义线性回归模型
struct LinearRegression : torch::nn::Module {
    torch::nn::Linear linear;

    LinearRegression(int in_features, int out_features)
            : linear(register_module("linear", torch::nn::Linear(in_features, out_features))) {}

    torch::Tensor forward(torch::Tensor x) {
        return linear(x);
    }
};

int main() {
    // 设置随机种子
    torch::manual_seed(42);

    // 超参数设置
    const int64_t N = 1000;     // 样本数量
    const int in_dim = 1;       // 输入维度
    const int out_dim = 1;      // 输出维度
    const int epochs = 10000;    // 训练轮数
    const float lr = 0.01;      // 学习率

    // 1. 生成合成数据 (y = 3x + 1 + 噪声)
    torch::Tensor x = torch::linspace(0, 10, N).reshape({N, 1});
    torch::Tensor y = 3 * x + 1 + torch::randn({N, 1}) * 0.5;

    // 2. 创建模型和优化器
    LinearRegression model(in_dim, out_dim);
    torch::optim::SGD optimizer(model.parameters(), torch::optim::SGDOptions(lr));

    // 3. 训练循环
    std::cout << "开始训练...\n";
    for (int epoch = 1; epoch <= epochs; ++epoch) {
        // 前向传播
        torch::Tensor prediction = model.forward(x);

        // 计算均方误差损失
        torch::Tensor loss = torch::mse_loss(prediction, y);

        // 反向传播和优化
        optimizer.zero_grad();
        loss.backward();
        optimizer.step();

        // 每100轮打印进度
        if (epoch % 100 == 0) {
            std::cout << "Epoch: " << epoch << " | Loss: " << loss.item<float>() << "\n";
        }
    }

    // 4. 获取训练后的参数
    torch::Tensor weight = model.linear->weight;
    torch::Tensor bias = model.linear->bias;
    std::cout << "\n训练完成!\n";
    std::cout << "真实权重: w=3.0, b=1.0\n";
    std::cout << "学习权重: w=" << weight.item<float>() << ", b=" << bias.item<float>() << "\n";

    // 5. 模型预测示例
    torch::Tensor test_x = torch::tensor({7.0}).reshape({1, 1});
    torch::Tensor pred_y = model.forward(test_x);
    std::cout << "\n预测测试: x=7.0, y_pred=" << pred_y.item<float>() << " (真实值: 22.0)\n";

    return 0;
}

运行结果

开始训练...
Epoch: 100 | Loss: 0.253365
Epoch: 200 | Loss: 0.25197
Epoch: 300 | Loss: 0.251448
Epoch: 400 | Loss: 0.251252
Epoch: 500 | Loss: 0.251179
Epoch: 600 | Loss: 0.251151
Epoch: 700 | Loss: 0.251141
Epoch: 800 | Loss: 0.251137
Epoch: 900 | Loss: 0.251136
Epoch: 1000 | Loss: 0.251135
Epoch: 1100 | Loss: 0.251135
Epoch: 1200 | Loss: 0.251135
Epoch: 1300 | Loss: 0.251135
Epoch: 1400 | Loss: 0.251135
Epoch: 1500 | Loss: 0.251135
Epoch: 1600 | Loss: 0.251135
Epoch: 1700 | Loss: 0.251135
Epoch: 1800 | Loss: 0.251135
Epoch: 1900 | Loss: 0.251135
Epoch: 2000 | Loss: 0.251135
Epoch: 2100 | Loss: 0.251135
Epoch: 2200 | Loss: 0.251135
Epoch: 2300 | Loss: 0.251135
Epoch: 2400 | Loss: 0.251135
Epoch: 2500 | Loss: 0.251135
Epoch: 2600 | Loss: 0.251135
Epoch: 2700 | Loss: 0.251135
Epoch: 2800 | Loss: 0.251135
Epoch: 2900 | Loss: 0.251135
Epoch: 3000 | Loss: 0.251135
Epoch: 3100 | Loss: 0.251135
Epoch: 3200 | Loss: 0.251135
Epoch: 3300 | Loss: 0.251135
Epoch: 3400 | Loss: 0.251135
Epoch: 3500 | Loss: 0.251135
Epoch: 3600 | Loss: 0.251135
Epoch: 3700 | Loss: 0.251135
Epoch: 3800 | Loss: 0.251135
Epoch: 3900 | Loss: 0.251135
Epoch: 4000 | Loss: 0.251135
Epoch: 4100 | Loss: 0.251135
Epoch: 4200 | Loss: 0.251135
Epoch: 4300 | Loss: 0.251135
Epoch: 4400 | Loss: 0.251135
Epoch: 4500 | Loss: 0.251135
Epoch: 4600 | Loss: 0.251135
Epoch: 4700 | Loss: 0.251135
Epoch: 4800 | Loss: 0.251135
Epoch: 4900 | Loss: 0.251135
Epoch: 5000 | Loss: 0.251135
Epoch: 5100 | Loss: 0.251135
Epoch: 5200 | Loss: 0.251135
Epoch: 5300 | Loss: 0.251135
Epoch: 5400 | Loss: 0.251135
Epoch: 5500 | Loss: 0.251135
Epoch: 5600 | Loss: 0.251135
Epoch: 5700 | Loss: 0.251135
Epoch: 5800 | Loss: 0.251135
Epoch: 5900 | Loss: 0.251135
Epoch: 6000 | Loss: 0.251135
Epoch: 6100 | Loss: 0.251135
Epoch: 6200 | Loss: 0.251135
Epoch: 6300 | Loss: 0.251135
Epoch: 6400 | Loss: 0.251135
Epoch: 6500 | Loss: 0.251135
Epoch: 6600 | Loss: 0.251135
Epoch: 6700 | Loss: 0.251135
Epoch: 6800 | Loss: 0.251135
Epoch: 6900 | Loss: 0.251135
Epoch: 7000 | Loss: 0.251135
Epoch: 7100 | Loss: 0.251135
Epoch: 7200 | Loss: 0.251135
Epoch: 7300 | Loss: 0.251135
Epoch: 7400 | Loss: 0.251135
Epoch: 7500 | Loss: 0.251135
Epoch: 7600 | Loss: 0.251135
Epoch: 7700 | Loss: 0.251135
Epoch: 7800 | Loss: 0.251135
Epoch: 7900 | Loss: 0.251135
Epoch: 8000 | Loss: 0.251135
Epoch: 8100 | Loss: 0.251135
Epoch: 8200 | Loss: 0.251135
Epoch: 8300 | Loss: 0.251135
Epoch: 8400 | Loss: 0.251135
Epoch: 8500 | Loss: 0.251135
Epoch: 8600 | Loss: 0.251135
Epoch: 8700 | Loss: 0.251135
Epoch: 8800 | Loss: 0.251135
Epoch: 8900 | Loss: 0.251135
Epoch: 9000 | Loss: 0.251135
Epoch: 9100 | Loss: 0.251135
Epoch: 9200 | Loss: 0.251135
Epoch: 9300 | Loss: 0.251135
Epoch: 9400 | Loss: 0.251135
Epoch: 9500 | Loss: 0.251135
Epoch: 9600 | Loss: 0.251135
Epoch: 9700 | Loss: 0.251135
Epoch: 9800 | Loss: 0.251135
Epoch: 9900 | Loss: 0.251135
Epoch: 10000 | Loss: 0.251135

训练完成!
真实权重: w=3.0, b=1.0
学习权重: w=2.99355, b=1.03434

预测测试: x=7.0, y_pred=21.9892 (真实值: 22.0)

Process finished with exit code 0

更多推荐