머신러닝&딥러닝

머신러닝&딥러닝 (9) - 파이토치

xoos0420 2023. 6. 16. 17:48

2023-06-15 수업내용

1. 파이토치(Pytorch)

  • 텐서플로우와 함께 머신러닝, 딥러닝에서 가장 널리 사용되는 프레임워크
  • 초기에는 Torch라는 이름으로 Lua언어 기반으로 만들어졌으나, 파이썬 기반으로 변경한 것이 pytorch
  • 뉴욕대학교와 페이스북이 공동으로 개발하였고, 현재 가장 대중적이고 널리 사용됨

불러오기

import torch
print(torch.__version__)

1-1. 스칼라(Scalar)

  • 하나의 상수를 의미
var1 = torch.tensor([1])
type(var1)

var2 = torch.tensor([6, 5])

* 두 스칼라의 사칙 연산

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

1-2. 벡터(Vector)

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

type(vec1)

vec2 = torch.tensor([10, 20, 30])

* 두 벡터의 사칙 연산

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

1-3. 행렬(Matrix)

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

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

* 두 행렬의 사칙 연산

print(mat1 + mat2)
print(mat1 - mat2)
print(mat1 * mat2)
print(mat1 / mat2)

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(torch.subtract(tensor1,tensor2))
print(torch.multiply(tensor1,tensor2))
print(torch.divide(tensor1,tensor2))
print(torch.matmul(tensor1,tensor2))
  • matmul : 행렬 곱 연산

print(tensor1.add_(tensor2))
print(tensor1)
  • tensor1에 결과를 다시 저장, 모든 사칙 연산자에 _ 를 붙여 사용할 수 있음

2. 텐서의 변환

data = [[1,2], [3,4]]
print(data)

x_data = torch.tensor(data)
print(x_data)

import numpy as np
np_arr = np.array(data)
np_arr

x_np_1 = torch.tensor(np_arr)
x_np_1

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

x_np_2 = torch.as_tensor(np_arr)
print(x_np_2)

  •  ndarray와 동일한 메모리 주소를 가리키는 뷰를 만드는 함수
x_np_2[0, 0] = 200
print(x_np_2)print(np_arr)

  • 기존 메모리 주소의 ndarray 값을 변경하게 됨
x_np_3 = torch.from_numpy(np_arr)
print(x_np_3)
x_np_3[0, 0] = 400
print(x_np_3)
print(np_arr)

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

 

3. 파이토치 주요 함수

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

  • 2행 3열으로 1을 넣어줌
b = torch.zeros(2, 3)
print(b)

  • 2행 3열으로 0을 넣어줌
c = torch.full((2,3), 10)
print(c)

  • 2행 3열으로 10을 넣어줌
d = torch.empty(2,3)
print(d)

  • 실수 무작위값을 넣어줌
e = torch.eye(5)
print(e)

  • 주대각선에만 값을 넣어줌, 파라미터만큼 행과 열을 만들어 줌
f = torch.arange(10)
print(f)

  • 0 to 파라미터 까지의 범위를 지정해줌
g = torch.rand(2, 3)
print(g)

  • 랜덤한 숫자를 나열해줌, 0~1 사이의 양수만 출력
h = torch.randn(2, 3)
print(h)

  • 평균이 0이고 표준편차가 1인 정규 분포에서 난수로 이루어진 텐서
i = torch.arange(16).reshape(2, 2, 4)
print(i, i.shape)

j = i.transpose(1, 2)
print(j, j.shape)

k = i.permute((2, 0, 1))
print(k, k.shape)

 

4. GPU 사용하기

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

ts = ts.reshape(4, 3)
ts = ts.int()
if torch.cuda.is_available():
  print('GPU를 사용할 수 있음')
  ts = ts.to('cuda')

print(f'shape: {ts.shape}')
print(f'type: {ts.dtype}')
print(f'device: {ts.device}')

 

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

a = torch.arange(1, 13).reshape(3, 4)
print(a)

print(a[1])
print(a[0, -1])
print(a[1:-1])
print(a[:2, 2:])