c++配置深度学习libtorch CPU环境
·
配置条件: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
更多推荐
所有评论(0)