libtorch的c++,加载*.pth

一、转换模型为TorchScript

前提:python只保存了参数,没存结构

要在C++中使用libtorch(PyTorch的C++接口),读取和加载通过torch.save保存的模型( torch.save(pdn.state_dict()这种方式,只保存了参数,没存结构),需要转换模型为TorchScript。在python下实现。

复制代码
def get_pdn_small(out_channels=384, padding=False):
    pad_mult = 1 if padding else 0
    return nn.Sequential(
        nn.Conv2d(in_channels=3, out_channels=128, kernel_size=4,
                  padding=3 * pad_mult),
        nn.ReLU(inplace=True),
        nn.AvgPool2d(kernel_size=2, stride=2, padding=1 * pad_mult),
        nn.Conv2d(in_channels=128, out_channels=256, kernel_size=4,
                  padding=3 * pad_mult),
        nn.ReLU(inplace=True),
        nn.AvgPool2d(kernel_size=2, stride=2, padding=1 * pad_mult),
        nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3,
                  padding=1 * pad_mult),
        nn.ReLU(inplace=True),
        nn.Conv2d(in_channels=256, out_channels=out_channels, kernel_size=4)
    )

def get_pdn_medium(out_channels=384, padding=False):
    pad_mult = 1 if padding else 0
    return nn.Sequential(
        nn.Conv2d(in_channels=3, out_channels=256, kernel_size=4,
                  padding=3 * pad_mult),
        nn.ReLU(inplace=True),
        nn.AvgPool2d(kernel_size=2, stride=2, padding=1 * pad_mult),
        nn.Conv2d(in_channels=256, out_channels=512, kernel_size=4,
                  padding=3 * pad_mult),
        nn.ReLU(inplace=True),
        nn.AvgPool2d(kernel_size=2, stride=2, padding=1 * pad_mult),
        nn.Conv2d(in_channels=512, out_channels=512, kernel_size=1),
        nn.ReLU(inplace=True),
        nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3,
                  padding=1 * pad_mult),
        nn.ReLU(inplace=True),
        nn.Conv2d(in_channels=512, out_channels=out_channels, kernel_size=4),
        nn.ReLU(inplace=True),
        nn.Conv2d(in_channels=out_channels, out_channels=out_channels,
                  kernel_size=1)
    )

import torch

# 假设你有一个已训练的模型
model = get_pdn_small()

# 加载模型的state_dict
model.load_state_dict(torch.load('teacher_small.pth'))
model.eval()  # 设置模型为评估模式

# 将模型转化为TorchScript
scripted_model = torch.jit.script(model)
scripted_model.save('teacher_small.pt')

二、在C++中加载TorchScript模型

在C++中,你可以使用torch::jit::load来加载.pt文件,如下所示:

复制代码
#include <torch/script.h>  // One-stop header for loading TorchScript models
#include <iostream>
#include <memory>

int main() {
    // 加载TorchScript模型
    try {
        // 加载模型
                std::shared_ptr<torch::jit::Module> model = std::make_shared<torch::jit::Module>(torch::jit::load("teacher_small.pt"));


        std::cout << "Model loaded successfully!" << std::endl;

        // 你可以在这里使用模型进行推理,比如输入一个张量
        // 例如,如果输入是一个3x224x224的图像,你需要创建一个相应的Tensor
        torch::Tensor input = torch::randn({1, 3, 224, 224});  // 示例输入
        std::vector<torch::jit::IValue> inputs;
        inputs.push_back(input);

        // 执行模型推理
        at::Tensor output = model->forward(inputs).toTensor();
        std::cout << "Output tensor: " << output << std::endl;
    }
    catch (const c10::Error& e) {
        std::cerr << "Error loading the model: " << e.what() << std::endl;
        return -1;
    }
}
相关推荐
其美杰布-富贵-李7 小时前
P-value 到底是什么?从“原假设”到“统计显著性”的完整理解
深度学习·机器学习·统计
Damon小智8 小时前
眼见不一定为实:WAIC 2026 探展合合信息,实测 AI 去反光 + AI 跨模态鉴伪两项黑科技
人工智能·ocr
AvatarAI_Walker8 小时前
2026年7月安徽健康 IP 孵化:四家机构服务特点与场景关注方向梳理
大数据·人工智能·tcp/ip·精选
栋***t8 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
不爱记笔记8 小时前
音视频转笔记工具横评2026,通义听悟、Ai好记、NotebookLM 实测对比
人工智能·笔记·ai·音视频·飞书·obsidian
Highcharts.js8 小时前
如何下载使用Highcharts Grid 开发web可编辑表格
前端·人工智能·grid 表格·web 表格·在线编辑表格·highcharts表格安装·表格开发工具
服装 AI 增长黑客8 小时前
AI落地服装店:从流量焦虑到经营闭环,哪些能力真实可用?
人工智能
weiwin1238 小时前
MAF 入门(7):在 MAF 中使用 RAG
人工智能
JuiceFS8 小时前
GPFS、Alluxio、JuiceFS 怎么选?一文看懂架构与适用场景
人工智能·后端
爱吃程序猿的喵8 小时前
LingBot-Map 复现与原理剖析:基于 Geometric Context Transformer 的流式 3D 重建
人工智能·python·深度学习·计算机视觉·3d·transformer