Python/머신러닝, 딥러닝

Python 머신러닝, 딥러닝 파이토치

dustKim 2024. 6. 18. 23:00
파이토치(Pytorch)

 

- Tensorflow와 함께 머신러닝, 딥러닝에서 가장 널리 사용되는 프레임워크이다.

- 초기에는 Torch라는 이름으로 Lua언어 기반으로 만들어졌으나, 파이썬 기반으로 변경한 것이 Pytorch이다.

- 뉴욕대학교와 페이스북(메타)이 공동으로 개발하였고, 현재 가장 대중적인 머신러닝, 딥러닝 프레임워크이다.

# import
import torch

# version 확인
print(torch.__version__)

 

  • 스칼라(Scalar)

- 하나의 상수를 의미한다.

더보기
var1 = torch.tensor([1])
var1
결과

 

# type 확인
type(var1)
결과

 

# Float형
var2 = torch.tensor([10.5])
var2
결과

 

 

# 두 스칼라의 사칙 연산
print(var1 + var2)
print(var1 - var2)
print(var1 * var2)
print(var1 / var2)
결과

 

  • 벡터(Vector)

- 상수가 두 개 이상 나열된 경우를 말한다.

더보기
vec1 = torch.tensor([1, 2, 3])
vec1
결과

 

 

# Float형
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, 10, 15])

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

 

값의 개수가 같지 않으면 사칙연산에서 위와 같은 에러가 나온다.

 

  • 행렬(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)
결과

 

같은 행, 같은 열에 값들끼리 사칙연산이 가능하다.

 

  • 텐서(Tensor)

- 다수의 행렬이 모인 것을 텐서라고 한다.

- 배열이나 행렬과 매우 유사한 특수 자료구조이다.

- 파이토치(Pytorch)는 텐서를 사용하여 모델의 입력과 출력, 모델의 매개변수들을 처리한다.

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

tensor2 = torch.tensor([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])
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))
결과

 

 

# tensor1에 결과를 다시 저장하는 형태, replace 연산
print(tensor1.add_(tensor2))

# 모든 사칙연산자에 _를 붙이면 inplace=True가 됨
print(tensor1.subtract_(tensor2))
결과

 

텐서(Tensor)의 변환
더보기
# 기본 행렬
data = [[1, 2], [3, 4]]
print(data)
결과

 

 

# tensor 자료형으로 바꿈
x_data = torch.tensor(data)
print(x_data)
결과

 

 

# 다시 ndarray로 바꿈
np_array = np.array(x_data)
np_array
결과

 

 

# 또 다시 tensor 자료형으로 변경
x_np_1 = torch.tensor(np_array)
x_np_1
결과

 

이렇게 자유롭게 변환시킬 수 있다.

 

 

x_np_1[0, 0] = 100
print(x_np_1)
print(np_array) # 바뀌지 않음
결과

 

x_np_1과 np_array는 다른 메모리 주소에 저장되어 있기 때문에 값이 변하지 않는 것이다.

 

 

# as_tensor(): ndarray와 동일한 메모리 주소를 가르키는 뷰를 만듦
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) # 바뀜. 메모리에 있는 값을 같이 사용한다.
결과

 

위와 같이 as_tensor()을 사용하면 같은 메모리 주소를 가리키기 때문에 값을 변경하면 같이 변하게 되는 것이다.

 

 

# 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)
결과

 

as_tensor()와 같이 from_numpy 를 사용하면 같은 메모리 주소를 가리키게 된다. 따라서 값을 변경하면 같이 변경되게 된다.

 

파이토치(Pytorch) 주요 함수

 

- ones(size, ..): size와 같은 모양의 텐서를 만들어 주는데, 1의 값을 갖는 텐서이다.

- ones_like(): 입력한 텐서와 동일한 모양의 텐서를 만들어주는데, 1의 값을 갖는 텐서이다.

 

- zeros(size, ..): size와 같은 모양의 텐서를 만들어 주는데, 0의 값을 갖는 텐서이다.

- zeros_like(): 입력한 텐서와 동일한 모양의 텐서를 만들어주는데, 0의 값을 갖는 텐서이다.

 

- full(size, fill_value): size와 같은 모양의 텐서를 만들어주는데, fill_value의 값을 갖는 텐서이다.

 

- empty(size): size와 같은 모양의 텐서를 만들어주는데, 임의의 값을 갖는 텐서이다.

 

- eye(parameter): parameter만큼 텐서를 만들어주는데, 주대각선에만 값을 넣어준다.

 

- arrange(parameter): parameter 만큼 일정하게 증가하는 텐서를 만들어준다.

 

- rand(size): size와 같은 모양의 텐서를 만들어주는데, 0 ~ 1 사이의 값을 랜덤으로 갖는 텐서이다.

 

- randn(size): size와 같은 모양의 텐서를 만들어주는데, 평균이 0이고 표준편차가 1인 정규분포에서 무작위 샘플링 값을 갖는 텐서이다.

 

- reshape(size): 차원을 지정한 size로 변환하는 함수이다. 전체 텐서의 수가 같이야 한다.

 

- permute(index): 차원을 지정한 인덱스로 변환하는 함수이다.

 

더보기
a = torch.ones(2, 3)
print(a)
결과

 

 

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

 

 

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

 

위 함수들은 기본값을 가진 영상을 만들때 주로 사용된다고 한다.

 

 

# 아무 값이나 들어감
d = torch.empty(2, 3)
print(d)
결과

 

 

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

 

 

# 일정하게 증가하는  tensor 자료형을 만들어줌
f = torch.arange(10)
print(f)
결과

 

 

# 0 ~ 1사이의 값으로 랜덤하게 만들어줌
g = torch.rand(2, 3)
print(g)
결과

 

 

# 평균이 0이고, 표준편차가 1인 정규분포에서 무작위 샘플링
h = torch.randn(2, 3)
print(h)
결과

 

 

# 차원을 바꿔준다.
i = torch.arange(16).reshape(2, 2, 4) # 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)
결과

 

텐서(Tensor)의 인덱싱와 슬라이싱
더보기
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:])
결과

 

 

추가적으로

코랩에서 GPU 사용하기

 

- 코랩에서 device 변경하는 방법

: 상단 메뉴 > 런타임 클릭 > 런타임 유형 변경 > 하드웨어 가속기를 GPU로 변경 > 저장 후 세션 다시 시작