파이토치 사용법

📌 01. 파이토치의 기본 사용법

# pytorch를 사용하기 전에, torch 패키지 import
import torch

1. 텐서 만들기

# 2X3 크기의 텐서 만들기 (값을 랜덤하게)
torch.Tensor(2,3)

# 2X3 크기, 0~1 사이의 값으로 텐서 만들기 (균등 분포)
torch.rand(2,3)

# 2X3 크기의 표준 정규 분포값을 가지는 텐서 만들기
torch.randn(2,3)

# 2X3 크기, 스칼라값 0으로 채워진 텐서 만들기
torch.zeros(2,3)

# 2X3 크기, 스칼라값 1로 채워진 텐서 만들기
torch.ones(2,3)

# 2X3 크기, 0과 1 외의 특정값으로 채워진 텐서 만들기
x = torch.Tensor(2,3)
x.fill_(5)

# list로 텐서 만들기
torch.Tensor([[1,2,3], [4,5,6]])

# numpy로 텐서 만들기
# numpy의 기본 데이터 타입은 float64이므로 
# 텐서로 변경했을 때 tensor의 타입은 DoubleTensor
import numpy as np
npy = np.random.rand(2,3) # 2X3 크기의 numpy 난수 생성
torch.from_numpy(npy) # numpy를 텐서로 변환

2. 텐서 타입과 크기

# 기본 텐서 타입은 FloatTensor
# 텐서 타입은 1) 초기화할 때 지정, 2) 나중에 타입캐스팅 메서드를 사용해 다른 타입으로 변경 가능

# 1) 초기화할때 지정
torch.FloatTensor([[1,2,3], [4,5,6]]) # 텐서 타입은 torch.FloatTensor
torch.LongTensor([[1,2,3], [4,5,6]]) # 텐서 타입은 torch.LongTensor
torch.tensor([[1,2,3], [4,5,6]], dtype=torch.int64) # 텐서 타입은 torch.LongTensor

# 2) 나중에 타입캐스팅 메서드를 사용해 다른 타입으로 변경
x = torch.FloatTensor([[1,2,3], [4,5,6]]) # 일 경우
x = x.long() # 텐서 타입은 torch.LongTensor
x = x.float() # 텐서 타입은 torch.FloatTensor

3. 텐서 연산

# 텐서를 더하는 방법 2가지
x = torch.randn(2,3) # 일 경우 
# 1) torch.add(x+x)
# 2) x + x

# 2D 텐서에서 행은 차원0(dim=0), 열은 차원1(dim=1)로 표현
x = torch.arange(6) # 0~5까지 1씩 증가하는 텐서 생성
x = x.view(2,3) # 1X6 크기를 2X3 크기로

torch.sum(x, dim=0) # 결과값 : tensor([3., 5., 7.])
torch.sum(x, dim=1) # 결과값 : tensor([3., 12.])
torch.transpose(x,0,1) # 행과 열을 전치

4. 인덱싱 및 슬라이싱

x = torch.arange(6).view(2,3)

# 행은 1까지, 열은 2까지 
x[:1, :2] # 결과값 : tensor([[0., 1.]])

# 0행 1열 값
x[0,1] # 결과값 : 1.0


# index_select 사용하기
#1)
indices = torch.LongTensor([0,2])
torch.index_select(x, dim=1, index=indices) 
# 결과값 : tensor([[0., 2.], [3., 5.]])
# index_select 함수를 사용하여 x 를 적용 -> 즉, x 에서 dim=1이므로 0번째 열과 2번째 열의 값을 적용

# 2) 
indices = torch.LongTensor([0,0])
torch.index_select(x, dim=0, index=indices)
# 결과값 : tensor([[0., 1., 2.], [0., 1., 2.]])
# dim=0이므로, x에서 0번째 행과 0번째 행을 적용


# 배열 인덱싱
row_indices = torch.arange(2).long() # [0,1] 값을 가지는 long 타입의 텐서 생성
col_indices = torch.LongTensor([0,1]) # [0,1] 값을 가지는 long 타입의 텐서 생성
x[row_indices, col_indices] # 결과값 : tensor([0., 4.]
# 행: [0,1], 열:[0,1] 인 상황 -> [0,0] 값과 [1,1] 값 반환

5. 텐서 연결

x = torch.arange(6).view(2,3)

#1)
torch.cat([x,x], dim=0) # 행으로 붙이기
# 결과값 : tensor([[0., 1., 2.], [3., 4., 5.], [0., 1., 2.], [3., 4., 5.]])

#2)
torch.cat([x,x], dim=1) # 열로 붙이기
# 결과값 : tensor([[0., 1., 2., 0., 1., 2.], [3., 4., 5., 3., 4., 5.]])

#3) 
# cat : 주어진 차원에 텐서 연결, stack : 새로운 차원에 텐서 연결
torch.stack([x,x]) 
# 결과값 : tensor([[[0., 1., 2.,], [3., 4., 5.]],  [[0., 1., 2.], [3., 4., 5.]]])

6. 텐서의 행렬곱

x1 = torch.arange(6).view(2,3)

x2 = torch.ones(3,2)
x2[:, 1] += 1 # 1열에 1 더하기

torch.mm(x1, x2) # x1과 x2의 행렬곱

7. 텐서와 계산그래프

# requires_grad = True : gradient를 기록하는 부가 연산을 활성화시킴
x = torch.ones(2, 2, requires_grad = True)

x.grad is None # True (gradient 존재x)

y = (x+2) * (x+5) + 3
x.grad is None # True (gradient 존재x)

z = y.mean()
z.backward() # 역방향 계산
x.grad is None # False (gradient 존재o)

# 역방향 계산은 정방향 계산에 참여한 텐서 객체에 대한 gradient 값을 계산하고, 파라미터 값을 업데이트함
# -> 그렇기 때문에 역방향 계산인 backward()를 해줬을때 gradient가 존재

좋은 웹페이지 즐겨찾기