본문 바로가기
머신러닝 & 딥러닝

13. 파이토치(Pytorch)

by 곽정우 2024. 6. 13.

1. Clusters(클러스터)

  • Tensorflow와 함께 머신러닝, 딥러닝에서 가장 널리 사용되는 프레임워크
  • 초기에는 Torch라는 이름으로 Lua언어 기반으로 만들어졌으나, 파이썬 기반으로 변경한 것이 Pytorch
  • 뉴욕대학교와 페이스북(메타)이 공동으로 개발하였고, 현재 가장 대중적인 머신러닝, 딥러닝 프레임워크
import torch
  • 파이토치를 이용하고자 할때는 위와같이 import를 해주면 됩니다
import torch
print(torch.__version__)

 

1-1. 스칼라(Scalar)

  • 하나의 상수를 의미 (데이터가 하나만 들어가 있는 경우)
var1 = torch.tensor([1])
var1

type(var1)

var2 = torch.tensor([10.5])
var2

# 두 스칼라의 사칙 연산

print(var1 + var2)
print(var1 - var2)
print(var1 * var2)
print(var1 / var2)

 

1-2. 벡터(Vector)

  • 상수가 두 개 이상 나열된 경우
vec1 = torch.tensor([1,2,3])
vec1

vec2 = torch.tensor([1.5,2.4,3.3])
vec2

# 두 벡터의 사칙연산

print(vec1 + vec2)
print(vec1 - vec2)
print(vec1 * vec2)
print(vec1 / vec2)

vec3 = torch.tensor([5, 10, 15, 20])
vec3

vec1 + vec3 
# RuntimeError: The size of tensor a (3) must match the size of tensor b (4) at non-singleton dimension 0

 

1-3. 행렬(Matrix)

  • 2개 이상의 벡터 값을 가지고 만들어진 값으로 행과 열의 개념을 가진 숫자의 나열
matrix1 = torch.tensor([[1, 2], [3, 4]])
print(matrix1)

matrix2 = torch.tensor([[7, 8], [9, 10]])
print(matrix2)

# 두 행렬의 사칙 연산

print(matrix1 + matrix2)
print(matrix1 - matrix2)
print(matrix1 * matrix2)
print(matrix1 / matrix2)

 

1-4. 텐서(Tensor)

  • 다수의 행렬이 모이면 텐서라고 부름
  • 배열이나 행렬과 매우 유사한 특수 자료구조
  • 파이토치는 텐서를 사용하여 모델의 입력과 출력, 모델의 매개변수들을 처리 사용됨
from IPython.display import Image
Image(url='https://miro.medium.com/max/875/1*jRyyMAhS_NZxqyv3EoLCvg.png')

tensor1 = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(tensor1)

tensor2 = torch.tensor([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])
print(tensor2)

print(tensor1 + tensor2)
print(tensor1 - tensor2)
print(tensor1 * tensor2)
print(tensor1 / tensor2)

print(torch.add(tensor1, tensor2))
print('----------------------------')
print(torch.subtract(tensor1, tensor2))
print('----------------------------')
print(torch.multiply(tensor1, tensor2))
print('----------------------------')
print(torch.divide(tensor1, tensor2))
print('----------------------------')
print(torch.matmul(tensor1, tensor2)) # 행렬곱

# tensor1에 결과를 다시 저장, 모든 사칙연산자에 _를 붙이면 inplace가 됨

print(tensor1.add_(tensor2)) 
print(tensor1)

 

2. 텐서의 변환

data = [[1,2],[3,4]]
x_data = torch.tensor(data)
import numpy as np
np_array = np.array(data)
np_array

x_np_1 = torch.tensor(np_array)
x_np_1

x_np_1[0, 0] = 100
print(x_np_1)
print(np_array)

# as_tensor : ndarray와 동일한 메모리 주소를 가리키는 뷰를 만듦
# as_tensor는 다양한 자료구조가 들어와도 상관없음

x_np_2 = torch.as_tensor(np_array) 
print(x_np_2)
x_np_2[0, 0] = 200 
print(x_np_2)
print(np_array)

# from_numpy(): ndarray와 동일한 메모리 주소를 가리키는 뷰를 만듦

x_np_3 = torch.from_numpy(np_array) 
print(x_np_3)
x_np_3[0, 1] = 400
print(x_np_3)
print(np_array)

np_again = x_np_3.numpy()
print(np_again, type(np_again))

 

3. 파이토치 주요 함수

# 입력한 행렬의 구조를 1로 채움

a = torch.ones(2, 3)
print(a)

# 입력한 행렬의 구조를 0으로 채움

b = torch.zeros(2, 3)
print(b)

# 입력한 행렬의 구조를 정해준숫자(10)으로 채움

c = torch.full((2, 3), 10)
print(c)

# 입력한 행렬의 구조를 임의의 수로 채움 

d = torch.empty(2, 3)
print(d)

# 입력한 숫자(5) * 입력한 숫자(5) 의 행렬을 만들어 0으로 채우고 행의 순서의 위치에만 1을 채움

e = torch.eye(5)
print(e)

# 입력한 숫자(10)의 길이만큼 숫자를 나열(0부터 시작)

f = torch.arange(10)
print(f)

# 입력한 행렬의 구조를 랜덤의 숫자로 채움(양수로만)

g = torch.rand(2, 3)
print(g)

# 입력한 행렬의 구조를 랜덤의 숫자로 채움 (음수도 포함)

h = torch.randn(2, 3)
print(h)

# 첫번째 숫자는 메트릭스, 뒤의 두 숫자는 행렬

i = torch.arange(16).reshape(2, 2, 4)
print(i, i.shape)

# permute(): 차원을 지정한 인덱스로 변경
# i = (2, 2, 4)

j = i.permute((2, 0, 1)) # 2, 2, 4 -> 4, 2, 2
print(j, j.shape)

 

4. 텐서의 인덱싱과 슬라이싱

a = torch.arange(1,13).reshape(3,4)
print(a)
print('----------------------------')
print(a[1])
print('----------------------------')
print(a[0,-1])
print('----------------------------')
print(a[1:-1])
print('----------------------------')
print(a[:2,2:])

 

5. 코랩의 GPU 사용하기

  • 코랩에서 device 변경하는 방법
  • 상단메뉴 -> 런타임 -> 런타임 유형변경 -> 하드웨어 가속기를 GPU로 변경 -> 저장 ->세션 다시 시작 및 모두 실행
tensor = torch.rand(3,4)
print(tensor)
print(f'shape:{tensor.shape}')
print(f'type:{type(tensor)}')
print(f'dtype:{tensor.dtype}')
print(f'device:{tensor.device}')

# is_available(): gpu를 사용할 수 있는지 여부

tensor = tensor.reshape(4, 3)
tensor = tensor.int()
print(f'shape: {tensor.shape}')
print(f'type:{type(tensor)}')
print(f'type: {tensor.dtype}')
if torch.cuda.is_available():
    print('GPU를 사용할 수 있음')
    tensor = tensor.to('cuda')
print(f'device: {tensor.device}')

CPU를 사용할 경우
GPU를 사용할 경우

'머신러닝 & 딥러닝' 카테고리의 다른 글

15. 파이토치로 구현한 논리회귀  (0) 2024.06.13
14. 파이토치로 구현한 선형회귀  (0) 2024.06.13
12. KMeans  (0) 2024.06.13
11. 다양한 모델 적용  (0) 2024.06.13
10. lightGBM  (0) 2024.06.13