본문 바로가기
Python

파이토치, 텐서 (Tensor) 만들기

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

오늘부터 파이토치를 한 번 파보도록 하겠다.

파이토치 (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]])

오늘은 파이토치에서 행렬을 선언하는 방법에 대하여 알아보았다. 다음 시간에는 행렬의 계산과 변형에 대하여 더 깊이 알아보도록 하자.


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

 

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

반응형

댓글