如何在pytorch C ++ API中为模型提供一批框架?

时间:2019-02-13 07:57:44

标签: c++ pytorch torch

我已经编写了一个代码,借助PyTorch C ++前端api在C ++中加载pytorch模型。我想使用module->forward(batch_frames)为C ++中的预训练模型提供一批框架。但是它可以通过单个输入转发。
如何为模型提供一批输入?

我要批处理的一部分代码如下所示:

 cv::Mat frame;
 vector<torch::jit::IValue> frame_batch;

 // do some pre-processes on each frame and then add it to the frame_batch

 //forward through the batch frames
 torch::Tensor output = module->forward(frame_batch).toTensor();

2 个答案:

答案 0 :(得分:2)

您可以使用多种方法在libtorch中创建一批张量。
这是以下方法之一:
使用Torch :: TensorList:
由于torch::TensorListArrayRef,因此您无法直接向其添加任何张量,因此首先创建张量向量,然后使用该矢量创建TensorList

// two already processed tensor!
auto tensor1 = torch::randn({ 1, 3, 32, 32 });
auto tensor2 = torch::randn({ 1, 3, 32, 32 });
// using a tensor list
std::vector<torch::Tensor> tensor_vec{ tensor1, tensor2 };
torch::TensorList tensor_list{ tensor_vec};

auto batch_of_tensors = torch::cat(tensor_lst);
auto out = module->forward({batch_of_tensors}).toTensor();

或者您可以:

auto batch_of_tensors = torch::cat({ tensor_vec});

auto batch_of_tensors = torch::cat({ tensor1, tensor2});

答案 1 :(得分:1)

最后,我在c ++中使用了一个函数来连接图像并制作一批图像。然后将批处理转换为torch :: tensor并使用该批处理输入模型。下面给出了一部分代码:

// cat 2 or more images to make a batch
cv::Mat batch_image;
cv::vconcat(image_2, images_1, batch_image);

// do some pre-process on image
auto input_tensor_batch = torch::from_blob(batch_image.data, {size_of_batch, image_height, image_width, 3});
input_tensor_batch = input_tensor_batch.permute({0, 3, 1, 2});

//forward through the batch frames
 torch::Tensor output = module->forward({input_tensor_batch}).toTensor();

请注意,将{}置于前向传递函数中!