9

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.

Martin Valgur
  • 5,793
  • 1
  • 33
  • 45
Afshin Oroojlooy
  • 1,326
  • 3
  • 21
  • 43

1 Answers1

17

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;
}
Fábio Perez
  • 23,850
  • 22
  • 76
  • 100
  • Thanks for the reply. I have `auto indx =torch::zeros({batch_size},at::dtype(at::kLong));` and then `p indx[0].item()` gives me `Couldn't find method at::Tensor::item`. Also, it comes with types like `Byte`, I even do not have same type in C++, and `bool` just does not work. – Afshin Oroojlooy Jan 16 '19 at 16:19
  • These commands work well for me on Linux and the stable libtorch. – Fábio Perez Jan 16 '19 at 16:33
  • So, you are saying `auto indx =torch::zeros({batch_size},at::dtype(at::kLong));` and `p indx[0].item()` works well for you, right? I am also using the stable version on Linux. So, what is the difference? – Afshin Oroojlooy Jan 16 '19 at 18:54
  • 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? – Afshin Oroojlooy Jan 16 '19 at 22:02