해당 내용은 Learn opencv의 내용을 번역하여 정리하였다.
필자는 tensorflow,keras,opencv dnn 모듈로 학습을 진행해보았으나 Pytorch는 얘기만 많이 들어봤을 뿐 직접 해본적이 없었다.따라서 이번기회에 내용 정리를 하며 기본적인 실습을 해볼 예정이다.
Pytorch는 딥러닝 모델을 구축하고 다양한 어플리케이션에서 사용이 용이한 python기반 library이다.
Pytorch는 numpy 배열과 유사한 핵심 데이터 구조로 Tensor를 사용한다.numpy배열이 아닌 tensor를 사용하는 이유는 적절한 소프트웨어와 하드웨어를 사용할수 있는 경우 tensor를 사용하는 것이 다양한 수학적 연산을 가속화 할 수 있다.
따라서 대량의 딥러닝 작업을 수행할 경우 속도가 크게 달라진다.
keras,tensorflow,caffe,theano 등 많은 딥러닝 라이브러리가 있지만 굳이 pytorch를 배우는 이유가 무엇인가.
이상적인 Deep Learning library는 배우기 쉽고, 다양한 어플리케이션에서 사용이 가능해야 하며 거대한 실제 데이터 세트를 처리할 수 있을만큼 효율적이고 입력 데이터에 불확실성이 있는 경우에도 올바른 결과를 제공해야 한다.
Pytorch는 이러한 조건에 만족하는데,pythonic 코딩스타일은 쉽게 배우고 사용하기 편하다.GPU 가속, 분산 컴퓨팅 지원, 자동 기울기 계산(automatic gradient calculation)은 순방향 표현식에서 자동으로 역방향 전달을 수행한다.
물론, python때문에 runtime이 느려질 수 있지만 고성능C++API(libtorch)는 이런 overhead를 줄여준다.따라서 R&D to Production이 순조롭게 진행된다.
해당 그림은 각 단계와 관련된 중요한 모듈과 함께 일반적인 workflow를 보여준다.
여기서 중요한 Pytorch 모듈은 torch.nn,torch.optim,torch.utils및 torch.autograd이다.
모든 Deeplearning 프로젝트의 첫번째 단계는 Data load 및 Handling 과정을 거친다.Pytorch는 torch.utils.data를 통해 동일한 utility를 제공한다.
이 모듈의 두가지 중요한 class는 Dataset 및 DataLoader이다.
torch.nn모듈은 신경망을 만드는데 사용된다.FC layer,Conv layer,activation/loss function등 모든 신경망 계층을 제공한다.
Network architecture가 생성되고 데이터가 네트워크에 공급될 준비가 되면 네트워크가 Train을 시작하도록 가중치와 bias를 업데이트 하는 기술이 필요한데, torch.optim module에서 제공한다.마찬가지로 backward pass가 진행시 torch.autograd모듈이 사용된다.
모델이 train된 후에 test 또는 새로운 dataset에 대한 출력값을 예측하는데 사용할 수 있다.이러한 process를 model inference라고 한다.
pytorch는 또한 Python 런타임과 독립적으로 모델을 실행하는데 사용할수 있는 TorchScript를 제공하는데,tensor에 특정한 지침이 있는 VM(virtual machine)으로 생각할 수 있다.
Pytorch를 사용해 train된 모델은 ONNX와 같은 형식으로 변환 할 수 있다.이를 통해 MXNet,CNTK,Caffe2와 같은 다른 DL Framework에서 동일한 모델을 사용할 수 있다.ONNX모델을 Tensorflow로 변활할 수 있다.
Pytorch에서 사용되는 핵심 데이터 구조인 Tensor는 단순히 행렬을 말한다.Numpy 배열에 익숙하다면 Pytorch Tensor를 이해하는데 어렵지 않다.Scalar값은 0차원 tensor로 표현된다.비슷하게, 열/행 행렬은 1차원 tensor를 사용하여 표현된다.
Tensor 소개를 하기 전 Pytorch를 설치한다.
위의 사진처럼 tensor의 형태가 numpy 행렬과 비슷한 형태인 것을 알 수 있다.
또한 shape 명령어로 tensor의 모양을 알 수 있다.
위의 과정에서 tensor를 생성했으니 tensor의 element를 확인하는 과정을 진행한다.
먼저 벡터라고하는 1D,2D,3D Tensor에 대해 알아본다.
위 사진처럼 numpy 행렬과 똑같은 방식으로 element에 접근하는 것을 알 수 있다.
위 사진처럼 dtype명령어를 통해 데이터 타입을 지정할 수 있다.
위에 언급했듯이 Pytorch Tensor와 Numpy배열이 매우 유사한걸 알수있다.해당 코드에서 보이듯이 torch.from_numpy 명령어를 통해 numpy행렬을 pytorch에서 사용 가능한걸 보여준다.
Pytorch는 CPU와 GPU에 대해 Tensor를 다르게 구현한다.모든 Tensor는 대규모 병렬,빠른 계산을 수행하기 위해 GPU를 사용할수 있다.
해당 작업을 통해 현재 Pytorch를 사용함에 있어 GPU를 사용할수 있는지 알아볼수있다.
본 게시물에서 Pytorch, Pytorch의 독창성 및 배워야 하는 이유, Numpy와 유사성에 대해 알아보았다.
CV를 공부함에 있어 Pytorch가 많은 도움이 될 것 같은 느낌이 많이 들었다.다음 게시물은 Torchvision을 사용하는 방법에 대해 게시 하겠다.