AI/pytorch

[pytorch] 파이토치 텐서 다루기 기본

공부하는묵 2022. 4. 17. 02:40

1. Tensor 만들기

가장 먼저 항상 사용되는 라이브러리인 torch와 numpy를 임포트

import numpy as np
import torch

임의의 값으로 초기화된 텐서를 만드는 rand(), 차원과 데이터 타입을 지정해 줄 수 있다. 

 

x = torch.rand(2, 3, dtype=torch.float16) # 2 * 3차원이고 데이터 타입은 float16인 텐서 생성

tensor([[0.8472, 0.3481, 0.9297], [0.2480, 0.0684, 0.0674]], dtype=torch.float16)

 

1로 초기화된 텐서를 만드는 zeros() (비슷하게 0으로 초기화 시켜주는 zeros도 있다.)

 

x = torch.zeros(4, 2)

tensor(

[[0., 0.],

[0., 0.],

[0., 0.],

[0., 0.]])

 

python의 리스트를 넣어 초기화 해 줄 수 있다. 

x = torch.tensor([[2.5, 0.1], [1.1, 4.5]], dtype=torch.float16)

tensor([[2.5000, 0.1000], [1.0996, 4.5000]], dtype=torch.float16)

 

2. 기본적 연산

Tensor 끼리 적용하는 사칙연산은 element wise하게 진행된다.

x = torch.tensor([1, 2, 3, 4])
y = torch.tensor([2, 3, 4, 5])
print(x + y) # tensor([3, 5, 7, 9])
print(x - y) # tensor([-1, -1, -1, -1])
print(x * y) # tensor([ 2,  6, 12, 20]) 
print(x / y) # tensor([0.5000, 0.6667, 0.7500, 0.8000])

inplace한 연산을 위해 _가 달려있는 함수를 이용할 수 있다. 

x = torch.rand(2, 2)
y = torch.rand(2, 2)
y.add_(x) # y = x + y 와 같다

 

행렬의 곱을 위해서는 matmul을 이용한다. 

x = torch.rand(3, 2)
y = torch.rand(2, 4)
z = x.matmul(y) # X * Y (행렬 곱)

 

Tensor의 크기(차원)을 알기 위해서는 size(), 또는 shape를 이용한다. 

x = torch.rand(3, 2)
print(x.size()) # torch.Size([3, 2])
print(x.shape) # torch.Size([3, 2])

Tensor의 요소를 인덱싱을 통해 접근할 수 있다. [] 안에 row에 대한 인덱스 : column에 대한 인덱스를 넣어준다.  

x = torch.rand(3, 2)
print(x)
print(x[:, 1])

Tensor의 차원을 바꾸기 위해서 view() 또는 reshape()를 사용한다. view는 원본과 데이터를 공유하므로 데이터가 바뀌게 되면, 원본의 데이터도 바뀌게 된다. 

x = torch.rand(3, 2)
# tensor([[0.1433, 0.8912],
#      	[0.1237, 0.0601],
#	[0.8288, 0.3015]])
y = x.view(6)
# tensor([0.1433, 0.8912, 0.1237, 0.0601, 0.8288, 0.3015])
y[0] = 1
print(x)
# tensor([[1.0000, 0.8912],
#      	[0.1237, 0.0601],
#	[0.8288, 0.3015]])

3. numpy와 tensor 바꾸기

numpy에서 tensor로 : from_numpy() 를 이용한다. 

a = np.ones(5)
b = torch.from_numpy(a)

tensor에서 numpy로 : numpy() 를 이용한다. 

a = torch.ones(5)
b = a.numpy()

단, cpu만 사용하는 경우 둘이 원본과 새로 생성된 데이터는 같은 주소를 가리키므로, 하나가 바뀌면 다른 하나도 값이 바뀐다. 

 

4. data를 GPU로 보내기

torch.cuda.is_available()로 gpu를 사용할 수 있는지 확인하고 gpu로 보낸다. 

to(device)를 통해 해당 device(gpu/cpu)로 데이터를 보낼 수 있다. 

numpy는 cpu에서만 사용가능함에 주의하자. 

if torch.cuda.is_available():
    device = torch.device("cuda")
    x = torch.ones(5, device=device)
    y = torch.ones(5)
    y = y.to(device) # gpu로 데이터를 보낸다.
    z = x + y
    # z.numpy() # numpy는 cpu에서만 데이터를 처리할 수 있다. 
    z = z.to("cpu") # 데이터를 다시 cpu로 가지고 온다. 
    z.numpy()