1

我正在尝试使用 LibTorch 导出经过训练的模型以及权重以在 C++ 中进行推理。但是,输出张量结果不匹配。

输出张量的形状是相同的。

model = FCN()
state_dict = torch.load('/content/gdrive/My Drive/model/trained_model.pth')
model.load_state_dict(state_dict)
example = torch.randn(1, 3, 768, 1024)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save('/content/gdrive/My Drive/model/mymodel.pt')

但是会生成一些警告,我认为这可能会导致生成不正确的结果。

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:137:TracerWarning:将张量转换为 Python 索引可能会导致跟踪不正确。我们无法记录 Python 值的数据流向,所以以后这个值会被当作一个常量来处理。这意味着跟踪可能不会推广到其他输入!/usr/local/lib/python3.6/dist-packages/torch/tensor.py:435:RuntimeWarning:迭代张量可能会导致跟踪不正确。传递不同形状的张量不会改变执行的迭代次数(并可能导致错误或默默地给出不正确的结果)。'不正确的结果)。',category=RuntimeWarning)

以下是生成输出张量的 LibTorch 代码

at::Tensor predict(std::shared_ptr<torch::jit::script::Module> model, at::Tensor &image_tensor) {
    std::vector<torch::jit::IValue> inputs;
    inputs.push_back(image_tensor);

    at::Tensor result = model->forward(inputs).toTensor();

    return result;
}

有没有人尝试在 LibTorch 中使用经过训练的 PyTorch 模型?

4

1 回答 1

1

刚刚遇到同样的问题,并找到了解决方案:添加

model.eval()

traced_script_module = torch.jit.trace(model, example)

并且该模型在 c++ 中给出与在 python 中相同的结果

于 2019-10-26T13:02:42.273 回答