I am wondering what is the best solution to transform std::vector and others to a torch::tensor. Built-in arrays work like so
float data[] = {1, 2, 3, 4, 5, 6, 7};
torch::Tensor f = torch::from_blob(data, {2,3});
and apparently there are no boundary checkings, but thats a different topic.
I pass an std::vector like so
std::vector<float> v{1, 2, 3, 4, 5, 6};
-
Is this the most efficient way to do that? There are no overloads for std::vector, so I have to comply to the signature with the infamous void* pointer.
-
Whats with the at::ArrayRef syntax? When should one use that and is a view like here
auto img_ = cv::imread(argv[1], cv::IMREAD_COLOR);
cv::Mat img(480, 640, CV_8UC3);
cv::resize(img_, img, img.size(), 0, 0, cv::INTER_AREA);
auto input_ = torch::tensor(at::ArrayRef<uint8_t>(img.data, img.rows * img.cols * 3)).view({img.rows, img.cols, 3});
generaly more efficient than the above approach?
- Whats the difference between
auto t = torch::Tensor f = torch::from_blob(std::data(v), {2, 3});
and
auto t = torch::CUDA(torch::kFloat32).tensorFromBlob(std::data(v), {2, 3});
I thought, torch::tensor instances are moves to the GPU by specifying associated tensor options for passing to the respective factory function…
- What is the result of toTensor(), as for example in this line
auto res = module->forward(inputs).toTensor();
I thought the result of the forward pass already is of type torch::tensor?
Unfortunately the C++ frontend Docs are not very clear on these matters yet