[pytorch] 파이토치 텐서 다루기 기본
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()