[Machine Learning] 03. PyTorch

Jihyeon Park·2024년 9월 12일

Machine Learning

목록 보기
3/5
post-thumbnail

파이토치

  • 파이썬 오픈소스 라이브러리
  • 딥러닝을 위한 프레임워크 : 신경망을 생성하고 학습시킴
  • 자연어 처리, 이미지 처리 등 다양한 처리를 위해 사용됨

파이토치 모듈과 클래스

torch : 주요 네임 스페이스
torch.autograd : 자동미분함수 내장
torch.nn : 신경망 구축을 위한 데이터구조나 레이어 정의
torch.optim : 확률적 경사하강법(SGD)를 중심으로 최적한 알고리즘 구현

torch.utils.data : SGD 반복 연산 시 사용하는 미니 배치용 유틸리티 함수 포함
(1) torch.utils.data.DataLoader :
순회 가능한 객체(iterable)로 처리하여 DataSet의 샘플에 쉽게 접근할 수 있도록 함
(2) torch.utils.data.DataSet :
샘플과 정답을 저장
(3) 예시
from torch.utils.data import DataSet
from torch.utils.data import DataLoader

torch.onnx

  • 서로 다른 딥러닝 프레임워크간 모델 공유시 사용하는 포맷
  • onnx(open neural network exchange)의 포맷
  • export할 때 사용

파이토치의 텐서

  • 텐서 : 어렵지 않음 텐서, 2차원 모듈 등을 뜻하는 단어
  • 텐서를 사용하여 모델의 입력(input), 출력(output), 매개변수들의 부호화(encode) 진행
  • 벡터형태의 텐서 : 1차원으로 구성된 값
  • 행렬형태의 텐서 : 2차원으로 구성된 값

파이토치 문법 - import와 텐서 초기화

  1. 텐서 초기화
    변수명 = torch.tensor(데이터)
    (1) 0으로 채워진 텐서 : torch.zeros_like(행렬)
    (2) 1으로 채워진 텐서 : torch.ones_like(행렬)
    (3) 0 ~ 1 사이의 소수로 채워진 텐서 생성 : torch.ran_lie(x, dtype=자료형)
    예시 : data3 = torch.rand_like(x, dtype=torch.float)

  2. 텐서 초기화 : 형상(shape)를 제시하고 텐서 생성
    shape = (차원 ex: 2행 3열인 경우(2, 3))
    변수명 = torch.rand(shape) # 바로 형상 적어도 됨 ex: torch.rand(2, 3)
    변수명 = torch.ondes(shape) # 바로 형상 적어도 됨 ex: torch.ones(2, 3)
    변수명 = torch.zeros(shape) # 바로 형상 적어도 됨 ex: torch.zeros(2, 3)

  3. 넘파이 배열을 텐서로 변경
    torch.from_numpy(넘파이 배열)

import torch
import numpy as np

data = np.array([[1, 2], [3, 4]])
x = torch.tensor(data) # 텐서로 만듦
x
torch.ones_like(x) # x의 속성 유지
torch.zeros_like(x) # x의 속성 유지
torch.rand_like(x, dtype=torch.float) # x의 속성 유지

파이토치 문법 - 차원 및 크기

  1. 차원 보여주기
    변수명.dim() # 차원 보여주기

  2. 크기 보여주기
    변수명.sizez() # 크기 보여주기

  3. 텐서 크기 변경 : view 사용
    변수명.view[-1,n] : 행은 상관없고, 열을 무조건 n개로 맞춤 변수명.view[n,-1] : 열은 상관없고, 행을 무조건 n개로 맞춤
    ex :
    print(t.view([-1, 2])) #열을 두개로
    print(t.view([-1, 1,2])) # 행=1, 열 = 2

  4. 파이토치 문법 - 차원 및 크기
    행렬의 차원 변경
    (1) Squeeze : 1차원인 경우, 차원 제거
    위치를 지정하면 해당 위치의 1만 제거 가능
    위치 지정하지 않으면 왼쪽부터 하나씩 제거
    예시 : shape=[3,1]인 경우 squeeze(1)이면, [3] 즉 벡터가 됨
    (2) UnSqueeze : 차원 추가
    위치를 지정하면 해당 위치에 size가 1인 빈 공간을 채워주면 차원 확장
    예시 : shape=[3]인 경우 unsqueeze(0)이면 [1, 3]의 행렬이 됨

# 차원 및 크기
t = torch.FloatTensor([
    [
        [0., 1., 2.],
        [3., 4., 5.]
    ],
    [
    [6., 7., 8.],
    [9., 10., 11]
    ]
])
t.view([-1, 2]) # 열 2개로
t.view([-1, 1, 2]) # 행 = 1, 열 = 2

파이토치 문법 - 연산

(1) 텐서의 합 / 평균 구하기
변수명.sum(dim = 0 or 1) # dim = 0 열 단위, dim=1 행단위 연산. dim이 없으면 전체 텐서를 대상으로 연산
변수명.mean(dim = 0, or 1)

(2) 사칙연산과 슬라이싱은 넘파이와 같음
(3) 행렬곱 : 행렬1.matnul(행렬2) # @를 적어도 무방
(4) 텐서 연결하기 : torch.cat([])
(5) 내용 덮어쓰기 : _ 사용

# 연산
data = np.array([[1, 2], [3, 4]])
x = torch.tensor(data)
x
x.sum(dim = 1) # 행 단위

실습

import torch
import numpy as np

# 해보기 1
t = torch.FloatTensor([1, 2, 3])
t
t.dim() # 차원 보여주기
t.size() # 크기 보여주기
t2 = torch.FloatTensor([[1., 2.],
                        [3., 4.],
                        [5., 6.]])
t2
t2.dim()
t2.size()
import torch
import numpy as np

# 해보기 2
t3 = torch.FloatTensor([[1.], [2.]])
t4 = torch.FloatTensor([[3.]]) # 브로드 캐스팅
t3 + t4
t3.mean()
t3.mean(dim = 0)
t5 = torch.FloatTensor([[1., 2.], [3., 4.]])
t6 = torch.FloatTensor([[1.], [2.]])
t5.matmul(t6) # 행렬곱
profile
Studying data analysis and data science!

0개의 댓글