我正在尝试使用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模型吗?
答案 0 :(得分:1)
遇到了同样的问题,并找到了解决方案: 添加
model.eval()
之前
traced_script_module = torch.jit.trace(model, example)
并且该模型在c ++中的结果与在python中的结果相同