본문 바로가기
Study/DL

[파이썬 딥러닝 파이토치] Part 1. Pytorch 기초

by hyeon827 2024. 1. 9.
  • 텐서 : 데이터를 표현하는 단위

4.1.1 Scalar

  • 스칼라 = 상숫값

  • torch 모듈에 내장된 메서드 (스칼라 사칙연산)

 

4.1.2 Vector

  • 백터 : 하나의 값을 표현할 때 2개 이상의 수치로 표현한 것

  • torch 모듈에 내장된 메서드(벡터 사칙연산)

 

4.1.3 Matrix

  • 행렬 : 2개 이상의 벡터 값을 통합해 구성된 값
  • 벡터 값 간 연산 속도를 빠르게 진행할 수 있는 선형 대수의 기본 단위

  • torch 모듈에 내장된 메서드 (행렬 값 간 사칙연산)
  • A.mul(B) : A행렬과 B행렬 간 원소별 곱
  • A.matmul(B) : A행렬과 B행렬의 행렬곱

 

4.1.4 텐서

  • 텐서 : 2차원 이상의 배열

 

  • torch 모듈에 내장된 메서드(텐서)

  • (행렬곱) 
  • [ [(1*9) + (2*11)] , [(1*10) + (2*12)], [(5*13) + (6*15)], [(5*14) + (6*16)],
  • [(3*9) + (4*11)], [(3*19) + (4*12)], [(7*13) + (8*15)], [(7*14) + (8*16)] ]

 

4.2 Autograd

  • PyTorch에서 Back Propagation을 이용해 파라미터 업데이트하는 방법은 Autograd 방식으로 쉽게 구현 

 

  • cuda.is_available() : 현재 파이썬 환경에서 torch module을 이용할 때 GPU를 이용해 계산 가능한지 파악
  • 참이면 'cuda' 장비 이용, 거짓이면 'cpu' 장비 이용

 

BATCH_SIZE(=64)

  • Input 데이터 64개
  • BATCH_SIZE 수만큼 계산된 오찻값을 평균내 Back Propagation을 적용 -> 파라미터 업데이트

INPUT_SIZE(=1000)

  • Input의 크기이자 입력층 노드 수
  • 1000 크기의 벡터 값을 64개 이용 -> (64,1000)

HIDDEN_SIZE(=100)

  • 입력층에서 은닉층으로 전달됐을 때 은닉층의 노드 수
  • (64,1000)의 Input들이 (1000,100) 크기의 행렬과 행렬 곱 계산

OUTPUT_SIZE(=10)

  • 딥러닝 모델에서 최종으로 출려되는 값의 벡터의 크기
  • 최종으로 비교하고자 하는 레이블의 크기와 동일

 

(1) 

  • randn : 평균이 0, 표준편차가 1인 정규분포에서 샘플링한 값(= 데이터를 만들겠다)
  • x -> (64,1000) 모양의 데이터 생성
  • 미리 설정한 DEVICE를 이용해 계산
  • 데이터 형태는 float
  • requires_grad =False (Input에 대해 Gradient를 하는 것이 아니기 때문)

(2) 

  • Output 역시 BATCH_SIZE 수만큼 결과값 필요
  • Output과의 오차를 계산하기 위해 크기를 '10'으로 설정
  • 나머진 Input 설정과 동일

(3)

  • 업데이트 할 파라미터 값 설정
  • Input 데이터와 행렵 곱을 하기 위해 행의 값이 1,000
  • 행렬 곱을 이용해 100 크기의 데이터를 생성하기 위해 (1000,100) 크기 데이터 생성
  • requires_grad = True (Gradient를 게산할 수 있도록 설정)

(4)

  • w1과 x의 행렬 곱 -> (64,100)
  • (100,10) 행렬을 통해 '10' 크기의 Output이 나오도록 설정
  • w2 역시 Back Propagation을 통해 업데이트 해야될 대상 -> requires_grad = True

 

(1)

  • Learning Rate
  • Gradient를 계산한 결괏값에 1보다 작은 값을 곱해 파라미터 업데이트
  • 파라미터 값 업데이트에 있어 가장 중요한 하이퍼파라미터

(2)

  • 500번 반복해 파라미터값 업데이트
  • x와 w1 행렬곱 결과값을 clamp라는 메서드를 이용해 비선형 함수 적용
  • clamp는 비선형 함수 ReLU()와 같은 역할(최솟값이 0이며 0보다 큰 값은 자기 자신을 갖음)

(3)

  • 예측값(y_pred)과 실제 레이블(y)의 차이값 계산(=loss)
  • pow(2) 이용해 제곱 후 sum()
  • t(반복 횟수)r가 100으로 나누어 떨어질 때 반복문 횟수와 Loss 값 출력
  • Loss 값에 대해 backward() 메서드 이용 -> 각 파라미터에 대한 Gradient를 계싼하고 이를 통해 Back Propagation

(4)

  • 파라미터 값을 업데이트할 때에는 해당 시점의 Gradient 고정한 후 업데이트
  • w1.grad, w2.grad에 learning_rate를 곱한 결괏값을 각각 w1,w2에서 빼줌(Loss 값이 최소로 되는 지점을 찾기 위해 뺌)
  • 파라미터 값 업데이트 후 각 파라미터의 Gradient를 초기화 해 다음 반복문 진행할 수 있도록 Gradient를 0으로 설정

 

결과

  • 500번의 반복문을 실행하면서 Loss 값이 줄어드는 것을 확인
  • Input이 w1과 w2를 통해 계산된 결괏값과 y값이 점점 비슷해진다는 의미