시작부터 이름이 거창하다. 그렇다. 필자가 썸네일로 밀고있는, 그리고 이 시리즈의 존재 이유를 설명하는 포스트다. 태생이 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])
아래는 현재 검색 가능한 파이토치 딥러닝 책 광고입니다! 파트너스 활동을 통해서 일정액의 수수료를 받을 수 있다고 하네요.ㅎㅎ 언젠가 제가 쓰는 이 블로그도 저 자리에 끼어있었으면 좋겠네요ㅎㅎ 밑에 책들은 한번 사서 읽어보고, 리뷰를 올려보도록 하겠습니다. =]
'Python' 카테고리의 다른 글
신경망과 회귀분석 비교하기 (Neural Net vs. Regression) (0) | 2020.07.22 |
---|---|
파이토치, 신경망 정의 (Custom nn Modules) (0) | 2020.07.20 |
파이토치, 미분 자동추적 기능 (Autograd) 에 대하여 (0) | 2020.07.18 |
파이토치, 텐서 (Tensor) 의 연산 (0) | 2020.07.15 |
파이토치, 텐서 (Tensor) 만들기 (0) | 2020.07.15 |
댓글