파이토치(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로 변경 > 저장 후 세션 다시 시작
'Python > 머신러닝, 딥러닝' 카테고리의 다른 글
Python 머신러닝, 딥러닝 파이토치로 구현한 논리회귀 (0) | 2024.06.24 |
---|---|
Python 머신러닝, 딥러닝 파이토치로 구현한 선형 회귀 (0) | 2024.06.18 |
Python 머신러닝 다양한 모델 적용하기 (0) | 2024.06.17 |
Python 머신러닝 LightGBM (0) | 2024.06.16 |
Python 러닝머신 랜덤 포레스트 (0) | 2024.06.15 |