0

0

c++怎么调用LibTorch运行深度学习模型_c++ PyTorch模型加载与推理【案例】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-17 11:17:30

|

714人浏览过

|

来源于php中文网

原创

C++加载LibTorch模型需用torch::jit::load()加载.pt脚本模型(非.pth),调用module.eval()和module.to()统一设备,输入张量须严格匹配shape/dtype/device,forward()返回IValue需按类型(toTensor/toGenericDict/toTuple)安全解包,GPU结果须.to(kCPU)后访问。

c++怎么调用libtorch运行深度学习模型_c++ pytorch模型加载与推理【案例】

怎么用 C++ 加载 torch::jit::script::Module 并运行推理

LibTorch 的核心是 torch::jit::script::Module,它对应 Python 侧用 torch.jit.tracetorch.jit.script 导出的 .pt 模型文件。C++ 里不能直接加载 .pth(state dict),必须用脚本模型格式。

常见错误:把训练时保存的 model.pth(含 state_dict)直接传给 torch::jit::load(),会报错 Expected a script module, but got a state dict

  • Python 侧导出必须用 traced_model.save("model.pt")scripted_model.save("model.pt")
  • C++ 侧加载用 torch::jit::load("model.pt"),返回 torch::jit::script::Module
  • 加载后建议调用 module.to(torch::kCUDA)(如果用 GPU)和 module.eval(),否则可能因 dropout/batch norm 行为异常导致输出不一致

输入张量怎么构造才匹配模型期望的 forward 签名

模型在 Python 中 trace/script 时记录了输入 shape、dtype 和名称(如果是命名 tuple 或 dict)。C++ 侧必须严格对齐,否则运行时报 Expected object of scalar type Float but got scalar type LongWrong number of arguments

典型场景:图像分类模型输入是 [1, 3, 224, 224]float32 张量,但你传了 int8[3, 224, 224](缺 batch 维)。

立即学习C++免费学习笔记(深入)”;

秒哒
秒哒

秒哒-不用代码就能实现任意想法

下载
  • torch::ones({1, 3, 224, 224}, torch::kFloat) 构造占位输入,注意 dtype 和 device 要与模型一致
  • 图像预处理(归一化、resize)必须在 C++ 里重做,不能依赖 Python 的 transforms;常用 OpenCV 读图后转 torch::from_blob + permute + to
  • 如果模型接受多个输入(如 forward(x, mask)),需用 std::vector<:jit::ivalue> 包装,顺序不能错

为什么 module.forward() 返回值取不到数据?

module.forward() 返回的是 torch::jit::IValue,不是 torch::Tensor。直接打印或取 .data_ptr() 会崩溃或得到乱码。

常见错误现象:程序 segfault,或输出 IValue of None,或 Expected Tensor but got GenericDict(模型返回字典时没解包)。

  • 先用 .toTensor() 尝试转成 Tensor(适用于单输出)
  • 若模型返回字典(如 DETR),用 .toGenericDict(),再用 .at("pred_logits") 取 key
  • 若返回 tuple,用 .toTuple()->elements() 拆包
  • 取值前务必检查 ivalue.isTensor() 等类型断言,避免运行时异常

GPU 推理卡死或结果全零?检查这三处

LibTorch 的 CUDA 支持不像 Python 那样“自动兜底”,很多细节要手动对齐。

  • 编译 LibTorch 时必须选 CUDA 版本(下载页明确标有 cu118cu121),且与系统 nvidia-drivercudnn 兼容;混用 cpu-only 库和 .to(kCUDA) 会静默失败
  • 所有输入 Tensor、模型、中间变量必须在同一个 device 上:创建时加 .to(torch::kCUDA),不要只移模型不移输入
  • GPU 推理后,结果 Tensor 仍位于 GPU,需调用 .to(torch::kCPU).detach().clone() 再访问数据,否则 .data_ptr() 指向显存地址,CPU 不可读
#include 
#include 

int main() {
    auto module = torch::jit::load("resnet18.pt");
    module.to(torch::kCUDA);
    module.eval();

    // 构造输入:[1,3,224,224] float32 GPU tensor
    auto input = torch::randn({1, 3, 224, 224}, torch::kFloat)
                     .to(torch::kCUDA);

    // 推理
    at::IValue output = module.forward({input});
    auto out_tensor = output.toTensor().to(torch::kCPU).detach().clone();

    // 打印 top-1 index
    std::cout << out_tensor.argmax(1) << std::endl;
}
LibTorch 的坑大多藏在类型转换和设备一致性上,而不是 API 调用本身。一个 to(kCUDA) 漏写,或一个 .toTensor() 忘加,就足以让程序跑出错、结果错、或者干脆不报错但输出全零。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

758

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

639

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

761

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1264

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

548

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 2.3万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号