AI 基础知识三 libtorch构建神经网络
详情见官网描述:,这里简单总结一下:1. torch 可以认为有两个前端版本,一个是Python前端,而另一个是c++(libtorch)前端2. libtorch前端适用于低延迟、高性能或 多线程环境的场景比如视频游戏或生产服务器场景3. libtorch文档、教程、示例相对比较少,官网更推荐使用Python前端4. 人个觉得两者有很多共通的知识点差别不大,从libtorch入门也是一个不错的选
背景
详情见官网描述: C++ 前端 — PyTorch 主文档 ,这里简单总结一下:
1. torch 可以认为有两个前端版本,一个是Python前端,而另一个是c++(libtorch)前端
2. libtorch前端适用于低延迟、高性能或 多线程环境的场景比如视频游戏或生产服务器场景
3. libtorch文档、教程、示例相对比较少,官网更推荐使用Python前端
4. 人个觉得两者有很多共通的知识点差别不大,从libtorch入门也是一个不错的选择
libtorch下载
下载选择 1. 直接选下载cpu版本就可以了 ,不用管gpu加速选项,简化环境设置
2. cpu版本选择推荐 1.8.0到 2.2.0,目前最新是2.9.0,选旧版本不影响学习,之所以推荐旧版本是因为在最新的版本上踩过一些坑了
下载点: Get Started 选择如图 
https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-2.9.0%2Bcpu.zip
//这是下载2.9.0
https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-2.2.0%2Bcpu.zip
//这是下载2.2.0
3. 下载完成后 解压至下目录
libtorch使用环境配置
vs2022 使用 libtorch 库 有三种方案:
方案1:
在工程项目中 手动增加引用libtorch的头文件目录,配置引用lib库文件,效率太低不推荐。
方案2:
使用cmake,编写CMakeLists.txt文件, 用vs创建cmake项目(如果vs没有cmake组件时自动跳转安装向导)

编写CMakeLists.txt文件
第1步 使用find_package查找torch包
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(torchpath "D:/libtorch2.8.0/debug")
else()
set(torchpath "D:/libtorch2.8.0/cpu")
endif()
find_package(Torch REQUIRED PATHS "${torchpath}/share/cmake/Torch/")
cmake会加载TorchConfig.cmake、TorchConfigVersion.cmake文件信息内容


第2步 使用 include_directories 增加头文件目录
include_directories(${TORCH_INCLUDE_DIRS})
第3步 引用lib和复制dll到运行目录
// 引用lib
if(OpenCV_FOUND)
target_link_libraries(${targetExeName} "${TORCH_LIBRARIES}" "${OpenCV_LIBS}")
else()
target_link_libraries(${targetExeName} "${TORCH_LIBRARIES}")
endif()
//查找所有dll文件
file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll"
"${opencvpath}/x64/vc16/bin/*.dll")
//将所有dll文件复制到运行目录下
add_custom_command(TARGET ${targetExeName}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${TORCH_DLLS}
$<TARGET_FILE_DIR:${targetExeName}>)
可选项 配置OpenCV 下载点 Releases - OpenCV 下载安装,完整CMakeLists.txt文件
# CMakeList.txt: LibtorchSimpleNeuralNetwork 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)
# 如果支持,请为 MSVC 编译器启用热重载。
if (POLICY CMP0141)
cmake_policy(SET CMP0141 NEW)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
endif()
project ("LibtorchSimpleNeuralNetwork")
set(targetExeName "LibtorchSimpleNeuralNetwork")
set(opencvpath "D:/opencv/build/")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(torchpath "D:/libtorch2.8.0/debug")
else()
set(torchpath "D:/libtorch2.8.0/cpu")
endif()
find_package(Torch REQUIRED PATHS "${torchpath}/share/cmake/Torch/")
find_package(OpenCV REQUIRED PATHS ${opencvpath})
if(OpenCV_FOUND)
include_directories(${OpenCV_INCLUDE_DIRS})
endif()
include_directories(${TORCH_INCLUDE_DIRS})
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}../bin/)
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}../bin2/)
endif()
add_executable (${targetExeName} "LibtorchSimpleNeuralNetwork.cpp" "LibtorchSimpleNeuralNetwork.h")
if(OpenCV_FOUND)
target_link_libraries(${targetExeName} "${TORCH_LIBRARIES}" "${OpenCV_LIBS}")
else()
target_link_libraries(${targetExeName} "${TORCH_LIBRARIES}")
endif()
file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll"
"${opencvpath}/x64/vc16/bin/*.dll")
add_custom_command(TARGET ${targetExeName}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${TORCH_DLLS}
$<TARGET_FILE_DIR:${targetExeName}>)
if (CMAKE_VERSION VERSION_GREATER 3.12)
set_property(TARGET LibtorchSimpleNeuralNetwork PROPERTY CXX_STANDARD 20)
endif()
# TODO: 如有需要,请添加测试并安装目标。
这个方式通用性好 window 、Linux都可以使用
方案3:
安装vs-torch模板 然后创建torch模板工程 如图
vs2022-torch模板 下载点:LibTorch Project (64-bit) - Visual Studio Marketplace
创建torch项目工程时 选择libtorch目录 
注意 图上红框目录结构 模板会libtorch目录下查找build-version确定版本。
注意 模板 支持torch版本1.8.0到 2.2.0,其他版本不支持。
注意 如果 sdk 10.0.18362.0 没有,换一个存在的sdk就可以了

模板项目自动生成代码运行如下

这种方式配置简单推荐使用
libtorch实现神经网络例子
接下来我们用libtorch库来实现 替换 之前c++写的神经网络,先来了解torch框架的核心数据结构张量
张量
张量(Tensor)是Torch中表示数据的基本单元,类似于多维数组(如标量、向量、矩阵或更高维结构),但专为深度学习优化设计。它支持GPU加速计算和自动微分(autograd)。
简单的说张量就是标量、向量、矩阵的统称 它之间加减乘除直接运行,神经网络计算不用手动求导
torch::nn
torch.nn模块是构建神经网络的核心库。
它提供了构建自定义层、激活函数、损失函数等所需的所有构建块。
torch::nn::Module
是所有神经网络模块和层的基类,它提供了一种组织网络层和损失函数的方法。
用户可以通过继承nn.Module来创建自定义的网络层或整个模型。
torch.nn.Linear
是一个非常重要的模块,也就是神经网络中的线性层,这个层会对输入数据应用一个线性变换,
即y = x*A + b,其中x是输入数据,A是层的权重,b是偏置量。
如 torch::nn::Linear(10, 3);表示输入层有10个神经元, 输出3个神经元。
权重用张量Linear::weight表示,3行10列矩阵
偏置量用张量Linear::bias表示,3行1列矩阵
torch.optim.Adam
在深度学习的训练过程中,优化器起着至关重要的作用,Adam优化器 是一种非常流行的梯度下降算法具有动态调整学习率和快速度收敛的优势。
关键代码
1. 构网络层初化权重和偏置量代码
struct NetModule : torch::nn::Module
{
NetModule()
{
fc1 = register_module("fc1", torch::nn::Linear(2, 2));
fc2 = register_module("fc2", torch::nn::Linear(2, 2));
fc1->to(torch::kDouble);
fc2->to(torch::kDouble);
fc1->weight.set_data(torch::tensor({ {0.15,0.20},
{0.25, 0.30} }, torch::kDouble));
fc1->bias.set_data(torch::tensor({ 0.35,0.35 }, torch::kDouble));
fc2->weight.set_data(torch::tensor({ {0.40,0.45}
,{0.50,0.55} }, torch::kDouble));
fc2->bias.set_data(torch::tensor({ 0.60,0.60 }, torch::kDouble));
}
}
2. 连接网络层
torch::Tensor forward(torch::Tensor x)
{
auto t = torch::sigmoid(fc1->forward(x));
auto l2 = torch::sigmoid(fc2->forward(t));
return l2;
}
3.训练过程
for (int64_t epoch = 0; epoch < epochs; ++epoch)
{
auto out = net.forward(input); //1.前向传播
auto loss = funloss(out, labels); //2.损失波函数
optimizer.zero_grad(); //3.梯度清零
loss.backward(); //4.反向传播
optimizer.step(); //5.更新参数
//6. 结束条件
if (abs(out.index({ 0 }).item<double>() - labels.index({ 0 }).item<double>()) <= accuracy &&
abs(out.index({ 1 }).item<double>() - labels.index({ 1 }).item<double>()) <= accuracy)
{
std::cout << " break [" << epoch + 1 << "/" << epochs << "], Loss: " << loss.item<double>() << ", out " << out << std::endl;
break;
}
}
代码免费下载 有camke工程(LibtorchSimpleNeuralNetwork)和 torch模板工程(LibtorchNeuralNetwork2)两部分代码 供参考
感谢大家的支持,如要问题欢迎提问指正。
更多推荐



所有评论(0)