딥러닝을 개발은 주로 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 |
|---|