오늘부터 파이토치를 한 번 파보도록 하겠다.
파이토치 (Pytorch) 불러오기
파이토치의 모토은 GPU 파워가 발달한 지금 기존에 사용되던 넘파이 (NumPy) 를 대체하기 위해서 태어났다. 파이토치 역시 결국 넘파이나 판다스 (Pandas) 같은 패키지 임으로 다음의 명령어를 사용하여 불러온다.
import torch
텐서 선언
텐서가 무엇이냐, 겁나 대단한 것처럼 보이나 결국 Array임. 우리가 많이 쓰는 행렬도 Array에 속하지만, 보통 Array라는 용어는 3차원 이상의 행렬을 암시한다. 이름부터 멋있는 파이토치인데 다른 용어들이 Array같이 다른 패키지에서 사용되는 것들이랑 동일하면 격이 떨어지므로, 텐서 (tensor) 라고 붙였다. 파이토치 설명서에 쓰면 텐서는 넘파이의 Array와 비슷하나 GPU 계산에도 쓸 수 있다고 나와있다.
응, 그냥 Array.
빈 행렬
속이 빈 5 by 3 행렬은 다음과 같이 선언한다. 주의할 것은 빈 행렬과 뒤에서 학습할 0 행렬은 다르다.
x = torch.empty(5, 3)
x
## tensor([[0., 0., 0.],
## [0., 0., 0.],
## [0., 0., 0.],
## [0., 0., 0.],
## [0., 0., 0.]])
랜덤 행렬
0에서 1사이로 채워서 행렬 선언은 rand()
함수를 사용한다. 파이썬의 OOP 때문에 .
을 사용해서 torch 오브젝트에 접근가능한 메서드를 불러오나보다.
randmat = torch.rand(5, 3)
randmat
## tensor([[0.5666, 0.3070, 0.9312],
## [0.5332, 0.0312, 0.9869],
## [0.6192, 0.7723, 0.6571],
## [0.5572, 0.3529, 0.6894],
## [0.6900, 0.2041, 0.4990]])
Identity 행렬
x = torch.eye(5)
x
## tensor([[1., 0., 0., 0., 0.],
## [0., 1., 0., 0., 0.],
## [0., 0., 1., 0., 0.],
## [0., 0., 0., 1., 0.],
## [0., 0., 0., 0., 1.]])
0 행렬
0 행렬 역시 zeros()
함수를 호출한다.
x = torch.zeros(5, 3)
x
## tensor([[0., 0., 0.],
## [0., 0., 0.],
## [0., 0., 0.],
## [0., 0., 0.],
## [0., 0., 0.]])
행렬의 타입
하지만 파이썬의 경우 변수형을 신경쓰는 언어이기 때문에 그냥 설정할 경우 기본 설정인 float 타입으로 저장이 된다. 정수 타입으로 딱 0만 들어있는 행렬을 선언하기 위해서는 다음과 같이 dtype
을 long으로 설정해주면 된다.
x = torch.zeros(5, 3, dtype = torch.long)
x
## tensor([[0, 0, 0],
## [0, 0, 0],
## [0, 0, 0],
## [0, 0, 0],
## [0, 0, 0]])
행렬 타입 변환
기존의 행렬이 주어졌을 경우, 데이터 타입을 변환하고 싶은 경우는 다음과 같이 type 함수를 이용해서 바꿔준다.
x = x + randmat
x.type()
## 'torch.FloatTensor'
x = x.type(torch.DoubleTensor)
x
## tensor([[0.5666, 0.3070, 0.9312],
## [0.5332, 0.0312, 0.9869],
## [0.6192, 0.7723, 0.6571],
## [0.5572, 0.3529, 0.6894],
## [0.6900, 0.2041, 0.4990]], dtype=torch.float64)
x.type()
## 'torch.DoubleTensor'
만약 위와 같이 Double 텐서의 경우를 정수로 바꿔주면 어떻게 될까? 소수점이 다 버려지고, 정수값만 남게 될 것이다.
x.type(torch.long)
## tensor([[0, 0, 0],
## [0, 0, 0],
## [0, 0, 0],
## [0, 0, 0],
## [0, 0, 0]])
행렬 직접 선언
행렬을 바로 선언할 경우 []
로 묶어줘서 선언한다. 이 방법은 넘파이에서 행렬선언이랑 비슷하다.
y = torch.tensor([[1.2, 3],
[3, 5.5]])
y
## tensor([[1.2000, 3.0000],
## [3.0000, 5.5000]])
arrange와 view를 사용한 직접 선언
넘파이에서처럼 파이토치에서도 벡터를 쉽게 선언하는 방법이 있다. 바로 torch.arrage()
. 파이토치는 이름이 똑같아서 좋음.
y = torch.arange(2, 4, 0.1)
y.view(-1, 4)
## tensor([[2.0000, 2.1000, 2.2000, 2.3000],
## [2.4000, 2.5000, 2.6000, 2.7000],
## [2.8000, 2.9000, 3.0000, 3.1000],
## [3.2000, 3.3000, 3.4000, 3.5000],
## [3.6000, 3.7000, 3.8000, 3.9000]])
-1
의 경우는 R에서 빈칸으로 놔둔 효과가 있음. 벡터 갯수를 설정해서 선언할 경우는 다음과 같이 linspace
를 사용하자.
y = torch.linspace(start=0, end=10, steps=20)
y.view(-1, 4)
## tensor([[ 0.0000, 0.5263, 1.0526, 1.5789],
## [ 2.1053, 2.6316, 3.1579, 3.6842],
## [ 4.2105, 4.7368, 5.2632, 5.7895],
## [ 6.3158, 6.8421, 7.3684, 7.8947],
## [ 8.4211, 8.9474, 9.4737, 10.0000]])
arange()
나 linspace()
를 사용해서 벡터를 선언한 후, diag()
함수를 사용하면 대각행렬도 쉽게 선언가능하다.
y = torch.arange(2, 4, 0.5)
y.diag()
## tensor([[2.0000, 0.0000, 0.0000, 0.0000],
## [0.0000, 2.5000, 0.0000, 0.0000],
## [0.0000, 0.0000, 3.0000, 0.0000],
## [0.0000, 0.0000, 0.0000, 3.5000]])
오늘은 파이토치에서 행렬을 선언하는 방법에 대하여 알아보았다. 다음 시간에는 행렬의 계산과 변형에 대하여 더 깊이 알아보도록 하자.
아래는 현재 검색 가능한 파이토치 딥러닝 책 광고입니다! 파트너스 활동을 통해서 일정액의 수수료를 받을 수 있다고 하네요.ㅎㅎ 언젠가 저도 한번 사서 읽어보고, 리뷰를 좀 올려봤으면 좋겠습니다. =]
'Python' 카테고리의 다른 글
신경망과 회귀분석 비교하기 (Neural Net vs. Regression) (0) | 2020.07.22 |
---|---|
파이토치, 신경망 정의 (Custom nn Modules) (0) | 2020.07.20 |
파이토치, 미분 자동추적 기능 (Autograd) 에 대하여 (0) | 2020.07.18 |
R과 파이토치, 텐서의 변환 (Bridge) (2) | 2020.07.15 |
파이토치, 텐서 (Tensor) 의 연산 (0) | 2020.07.15 |
댓글