Torch C++: Getting the value of a int tensor by using *.data<int>()
Asked Answered
C

1

11

In the C++ version of Libtorch, I found that I can get the value of a float tensor by *tensor_name[0].data<float>(), in which instead of 0 I can use any other valid index. But, when I have defined an int tensor by adding option at::kInt into the tensor creation, I cannot use this structure to get the value of the tensor, i.e. something like *tensor_name[0].data<at::kInt>() or *tensor_name[0].data<int>() does not work and the debugger keeps saying that Couldn't find method at::Tensor::data<at::kInt> or Couldn't find method at::Tensor::data<int>. I can get the values by auto value_array = tensor_name=accessor<int,1>(), but it was easier to use *tensor_name[0].data<int>(). Can you please let me know how I can use data<>() to get the value of an int tensor?

I also have a same problem with bool type.

Calcine answered 15/1, 2019 at 14:22 Comment(0)
D
18

Use item<dtype>() to get a scalar out of a Tensor.

int main() {
  torch::Tensor tensor = torch::randint(20, {2, 3});
  std::cout << tensor << std::endl;
  int a = tensor[0][0].item<int>();
  std::cout << a << std::endl;
  return 0;
}

~/l/build ❯❯❯ ./example-app
  3  10   3
  2   5   8
[ Variable[CPUFloatType]{2,3} ]
3

The following code prints 0 (tested on Linux with the stable libtorch):

#include <torch/script.h>
#include <iostream>                                     

int main(int argc, const char* argv[])                  
{
    auto indx = torch::zeros({20},at::dtype(at::kLong));
    std::cout << indx[0].item<long>() << std::endl;

    return 0;
}
Declamatory answered 16/1, 2019 at 0:47 Comment(4)
Thanks for the reply. I have auto indx =torch::zeros({batch_size},at::dtype(at::kLong)); and then p indx[0].item<long>() gives me Couldn't find method at::Tensor::item<long>. Also, it comes with types like Byte, I even do not have same type in C++, and bool just does not work.Calcine
These commands work well for me on Linux and the stable libtorch.Paulinapauline
So, you are saying auto indx =torch::zeros({batch_size},at::dtype(at::kLong)); and p indx[0].item<long>() works well for you, right? I am also using the stable version on Linux. So, what is the difference?Calcine
I see. Now, I have another problem. cout works fine, during the debug time, gdb cannot execute this code, which is weird. Do you have any idea about it?Calcine

© 2022 - 2024 — McMap. All rights reserved.