본문 바로가기
Python

R과 파이토치, 텐서의 변환 (Bridge)

by 슬통이 2020. 7. 15.
반응형

시작부터 이름이 거창하다. 그렇다. 필자가 썸네일로 밀고있는, 그리고 이 시리즈의 존재 이유를 설명하는 포스트다. 태생이 R로 시작해서 그런지 R에 대한 미련을 버릴 수가 없는것 같다. 또한 문서를 작성할 때, R에 대한 의존도가 상당히 높아서 포기가 안됨.

PytoRch = Pytorch + R

R에서는 Python과의 연동을 위하여 reticulate 이라는 패키지를 제공한다. 이 reticulate을 사용하여 파이썬에서 정의되어 있는 변수들을 R로 불러올 수 있는데, 파이토치에서는 넘파이와의 브릿지 (bridge)를 제공하고 있으니, 필자가 생각하는 R의 강점인 문서작성과 데이터 시각화는 R에서, 딥러닝에서 요구하는 GPU를 이용한 계산은 파이썬에서 하려는 나름 야심찬 계획이 있다.

파이토치 <-> 넘파이 변환

파이토치 to 넘파이

import torch
import numpy as np

a = torch.ones(5)
a
## tensor([1., 1., 1., 1., 1.])

a는 현재 1차원 텐서로 정의되어 있다. 이 텐서 a를 넘파이 1차원 array로 변환하기 위해서는 다음과 같이 numpy() 함수를 사용하면 된다.

b = a.numpy()
b
## array([1., 1., 1., 1., 1.], dtype=float32)
더보기

파이토치 튜토리얼을 보면, 이 변환에서 주의해야할 사항을 짚어주는데, 바로 두 개가 메모리를 공유한다는 것. 예를 들어 다음 코드를 보여줬는데, add_() 함수에 주목해야할 필요가 있다. add_()는 in-place함수라고 하는데, 메모리 상에 저장되어있는 곳에 가서 직접 바꿔준다. 즉, 이미 정의된 변수 주소가 바뀌지 않는다고 이해하고 있다.

a = a.add_(1)
a
## tensor([2., 2., 2., 2., 2.])
b
## array([2., 2., 2., 2., 2.], dtype=float32)

하지만 _ 부분을 빼고 add() 함수를 이용할 시에는 그냥 우리의 예상대로 된다. _ 붙은 함수 이해만 하고 넘어가면 될 듯하다.

a = a.add(1)
a
## tensor([3., 3., 3., 3., 3.])
b
## array([2., 2., 2., 2., 2.], dtype=float32)

넘파이 to 파이토치

넘파이에서 파이토치로 넘기는 방법은 다음과 같다.

a = np.arange(5)
b = torch.from_numpy(a)
a
## array([0, 1, 2, 3, 4])
b
## tensor([0, 1, 2, 3, 4])

파이토치 CPU <-> GPU

GPU상에 텐서를 만들 경우, 일단 자신의 파이토치가 GPU에 접근 가능한지에 대하여 체크해보자.

torch.cuda.is_available()
## True

GPU to CPU

GPU 상에 직접 텐서를 만드는 방법은 다음과 같다.

a = torch.arange(1, 4, device=torch.device("cuda"))
a
## tensor([1, 2, 3], device='cuda:0')

텐서의 저장공간을 옮길때는 to 함수를 쓴다.

b = a.to("cpu", torch.double)
b
## tensor([1., 2., 3.], dtype=torch.float64)

CPU to GPU

CPU에서 정의된 텐서 역시 GPU로 옮기기 위해서는 to 함수를 사용하도록 하자.

a = torch.tensor([1.1, 1.2, 4.8])
a
## tensor([1.1000, 1.2000, 4.8000])
a.to(torch.device("cuda"), torch.long)
## tensor([1, 1, 4], device='cuda:0')

R <-> 파이썬

R to Python

R과 파이썬의 경우 reticulate이라는 패키지를 이용한다.

library(reticulate)

파이썬에서 a변수에 넘파이 벡터를 저장하자.

# python
a = np.arange(1, 5)

R에서 이 벡터 a를 다음과 같이 불러올 수 있다.

py$a
## [1] 1 2 3 4

Python to R

R에서 정의한 벡터 b를 파이썬에서 불러보자.

# R 코드
b <- 1:10

파이썬에서 벡터 b를 불러보면 리스트로 불러짐. 따라서 np.array를 사용해서 넘파이 어레이로 바꿔주고, torch.from_numpy를 이용해서 다시 바꿔주면 됨.

# 파이썬
r.b

# to 파이토치
## [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = torch.from_numpy(np.array(r.b))
b
## tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

아래는 현재 검색 가능한 파이토치 딥러닝 책 광고입니다! 파트너스 활동을 통해서 일정액의 수수료를 받을 수 있다고 하네요.ㅎㅎ 언젠가 제가 쓰는 이 블로그도 저 자리에 끼어있었으면 좋겠네요ㅎㅎ 밑에 책들은 한번 사서 읽어보고, 리뷰를 올려보도록 하겠습니다. =]

 

파이토치 첫걸음:딥러닝 기초부터 RNN 오토인코더 GAN 실전 기법까지, 한빛미디어 펭귄브로의 3분 딥러닝 파이토치맛:PyTorch 코드로 맛보는, 한빛미디어 딥러닝에 목마른 사람들을 위한 PyTorch:개인용 GPU 학습 서버 구축부터 딥러닝까지, 비제이퍼블릭 PyTorch로 시작하는 딥러닝:딥러닝 기초에서 최신 모던 아키텍처까지, 에이콘출판 [제이펍] 파이토치 첫걸음

반응형

댓글