如何在C++中提取torch模型的输出?

我已经训练了一个keras模型,并使用mmdnn进行了转换。然后我尝试在C++代码中使用它:

#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <torch.h>int main(){    cv::Mat image;    image= cv::imread("test_img.png", cv::IMREAD_GRAYSCALE);   // 读取文件try{    torch::jit::script::Module module;    module = torch::jit::load("my_model.pth");    torch::IntArrayRef input_dim = std::vector<int64_t>({ 1, 2, 256, 256});    cv::Mat input_img;    image.convertTo(input_img, CV_32FC3, 1 / 255.0);    torch::Tensor x = torch::from_blob(input_img.data, { 1, 2, 256, 256 }, torch::kFloat);    torch::NoGradGuard no_grad;    auto output = module.forward({ x });    float* data = static_cast<float*>(output.toTensor().data_ptr());    cv::Mat output_img = cv::Mat(256, 256, CV_32FC3, data);    cv::imwrite("output_img.png", output_img);}catch (std::exception &ex){    std::cout << "exception! " << ex.what() << std::endl;}    return 0;}

这段代码抛出了一个异常:

exception! isTensor() INTERNAL ASSERT FAILED at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112, please report a bug to PyTorch. Expected Tensor but got Tuple (toTensor at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112) (no backtrace available)

这个异常是在调用toTensor()函数的这行float* data = static_cast<float*>(output.toTensor().data_ptr());时抛出的。如果我用toTuple()代替toTensor(),结果就没有data_ptr()函数了,但我需要这个函数来提取数据(并将其放入opencv图像中)。

如何从模型输出中提取图像?


回答:

在这种情况下,模型的回答是一个包含两张图像的元组。我们可以通过以下方式提取它们:

torch::Tensor t0 = output.toTuple()->elements()[0].toTensor();torch::Tensor t1 = output.toTuple()->elements()[1].toTensor();

变量t0t1包含模型输出的张量。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注