본문 바로가기

LibTorch

[LibTorch/C++] torch::Tensor indexing 방법

딥러닝을 개발은 주로 Python에서 이루어지지만, 실제 환경에 적용하다보면 C++에서 직접 작업할 필요가 있습니다.

 

이때, PyTorch의 c++ 버전인 LibTorch를 활용하는 것도 하나의 방법이 될 수 있습니다.

 

PyTorch 자체도 c++을 python으로 감싼 것이지만, 막상 c++ documentation이 잘 되어있지 않습니다.

 

본 카테고리 글들은 개발 과정에서 사용하게 된 함수들을 기록하기 위함입니다.

 

궁금하신 사항은 댓글로 남겨주세요.

 

 

 

우선 LibTorch와 iostream 라이브러리 include 합니다. (컴파일 환경 구축은 추후 다룰 예정)

 

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

 

Torch indexing을 위해 사용되는 namespace 입니다.

 

using namespace std;
using namespace torch::indexing;

 

1. random (2, 2, 2, 2) tensor 생성

 

torch::Tensor tempTensor = torch::rand({2, 2, 2, 2});

 

2. tempTensor의 일부분만 인덱싱하여 새로운 tensor 생성

    - Slice()는 numpy, pytorch의 : 과 같은 의미입니다.
    - Slice(1, None) 는 '1:'과 같은 의미입니다.  (여기서 None은 torch::indexing::None이라 namespace 없이 사용하면 안됨)

    - Slice(None, None, 2): '::2'와 같은 의미, 2칸씩 띄워서 indexing하겠다는 의미입니다.

 

torch::Tensor newTensor = tempTensor.index({Slice(), 1, Slice(), Slice()});

 

    - 결과물 출력 (torch::Tensor는 cout interface가 구현되어 있음)

 

cout << "temp Tensor : " << tempTensor << endl;
cout << "new  Tensor : " << newTensor << endl;

 

 

temp Tensor : (1,1,.,.) = 
  0.8006  0.8018
  0.3532  0.4838
(2,1,.,.) = 
  0.5949  0.7638
  0.9830  0.5545
(1,2,.,.) = 
  0.9157  0.9241
  0.8688  0.2136
(2,2,.,.) = 
  0.9035  0.1080
  0.4041  0.0715
[ CPUFloatType{2,2,2,2} ]

new  Tensor : (1,.,.) = 
  0.9157  0.9241
  0.8688  0.2136
(2,.,.) = 
  0.9035  0.1080
  0.4041  0.0715
[ CPUFloatType{2,2,2} ]

 

3. index에 실수 값 집어넣기 (index_put_ 활용)

    - tensor를 랜덤 값으로 초기화 후 출력합니다.

    - tensor[0, :, :, :]에 0을 넣어주고 출력합니다.

 

tempTensor = torch::rand({2, 2, 2, 2});
cout << "temp Tensor : " << tempTensor << endl;
tempTensor.index_put_({0, Slice(), Slice(), Slice()}, 0.0);
cout << "temp Tensor : " << tempTensor << endl;

 

- 결과물 출력

 

temp Tensor : (1,1,.,.) = 
  0.2024  0.3150
  0.1496  0.7991
(2,1,.,.) = 
  0.3550  0.0158
  0.7756  0.2709
(1,2,.,.) = 
  0.0196  0.8125
  0.4599  0.7583
(2,2,.,.) = 
  0.2890  0.6958
  0.2064  0.8500
[ CPUFloatType{2,2,2,2} ]

temp Tensor : (1,1,.,.) = 
  0  0
  0  0
(2,1,.,.) = 
  0.3550  0.0158
  0.7756  0.2709
(1,2,.,.) = 
  0  0
  0  0
(2,2,.,.) = 
  0.2890  0.6958
  0.2064  0.8500
[ CPUFloatType{2,2,2,2} ]

'LibTorch' 카테고리의 다른 글

[LibTorch/C++] torch::Tensor, vector간 데이터 이동  (0) 2022.07.06