在LibTorch中运行经过训练并从PyTorch导出的模型时获得的结果不正确

时间:2019-06-26 10:07:08

标签: python c++ pytorch onnx libtorch

我正在尝试使用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模型吗?

1 个答案:

答案 0 :(得分:1)

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

model.eval()

之前

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

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