
1. in pytorch rhythm
앞서 했던 과정들을 torch 코드를 짜는 방식으로 실제 코드를 짜는 것을 배워보는 강의이다. torch 에서는 아래와 같은 절차로 학습을 진행한다.
- Design model using class
- construct loss and optimizer
- Training cycle (forward, backward, update)
전체 코드를 한줄한줄 분석해보자.
Design model using class
모델 디자인 전, 우선적으로 dataset을 정의한다.
import torch : torch 라이브러리를 불러옴
tensor를 형성, 3*1의 텐서이다.
(+)
텐서의 크기 분석을 위해 .shape를 많이 사용한다.
torch.Size 객체 반환
위위 경우에는 torch.Size([3,1]) 반환 3행 1열 (행렬)
+ 만약 이미지를 텐서로 만들었을 때는?
[batch_size, channels, height, width] > [B,C,H,W]
B batch는 B개의 이미지
channel 한개 이미지의 3가지 색상 채널(ex RGB) 등으로 쓰임
torch.nn.Module을 상속받아 torch model로 동작, 클래스 이름은 자유
- 생성자 __init__ : 클래스 Model을 인스턴스 하였을 때, 자동적으로 실행되는 함수
- super().__init__() : 부모 클래스인 torch.nn.Module의 초기화를 진행(부모 클래스의 __init__ 을 실행한다는 말과 같음)
- self.linear = torch.nn.Linear(1,1) : 선형 레이어 (y = w*x+ b)를 생성
- 원형은 torch.nn.Linear(in_features=1, out_features=1)
- torch 내부에서 자동으로 weight와 bias를 학습 대상으로 만듬 (requires_grad=True)
- def forward(self,x) : torch.nn.module을 상속한 클래스는 반드시 foward()매서드를 정의해야 한다.
- 해당 매서드는 모델이 입력을 받아 출력을 계산하는 방법을 정의한다.
- 모델을 호출할 떄, model(x)라고 쓰면 자동적으로 model.foward(x)가 호출된다. (추론)
y_pred = self.linear(x)
- 위에 __init 에서 정의한 레이어에 입력 x를 전달, 레이어를 통과한 값이 변수에 저장된다
- 추론값 return
해당 과정 전체 코드
construct loss and optimizer
- model = Model() 위에서 정의한 모델 클래스를 인스턴스한다.
- criterion 손실함수(loss function)을 의미하는 이름
- optimizer 모델의 파라미터 (가중치 등)을 업데이트하는 알고리즘을 말함
criterion = torch.nn.MSELoss(reduction='sum')
- critertion 손실 함수 객체, criterion = torch.nn.MSELoss(reduction='sum') > MSE를 사용
- retuction = 'sum' 오차들을 모두 더한 값을 사용
- MSRLoss의 옵션 reduction='mean' : 우리가 생각하는 MSE (기본값)
- MSRLoss의 옵션 reduction='sum' : 오차 제곱의 합
- MSRLoss의 옵션 reduction='none' : 각 요소별 개별 loss를 텐서 형태로 반환
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
- optimizer 파라미터를 업데이트하는 알고리즘 객체
- SGD (Stochastic Gradient Descent) 확률적 경사 하강법을 사용
- model.parameters() : 모델에서 업데이트 할 파라미터들, nn.Model을 상속받은 객체가 .parameters() 매서드를 가짐, 모델 내에서 자동으로 학습 가능한 모든 파라미터(weight, bias)를 수집하여 반환
- lr = 0.01 : learnning rate
Training cycle (forward, backward, update)
추가로 저번 시간에 했던 학습 부분 코드와 비교하며 알아보자
1) forward pass
y_pred = model(x_data)
- 객체 model(x)를 호출하면, 자동적으로 model.foward(x) 매소드가 호출되어 추론값을 return한다.
- input 3*1 tensor , output 3*1 tensor
loss = criterion(y_pred, y_data)
- criterion 객체를 이용 , loss를 계산한다.
2) Backward
optimizer.zero_grad()
- 기울기 초기화, 저번 포스트에서도 확인했지만, torch는 grad를 누적합 하기 때문에 초기화를 해줘야 한다
loss.backward()
- loss에 대해 모델 파라미터의 grad를 계산, back - propagation , 결과는 .grad에 저장
- 각 파라미터에 대해 dL / dparm 구해놓음
3) update
optimizer.step()
- 가중치 (파라미터) 를 업데이트하는 알고리즘 객체인 optimizer로 파라미터를 update
- 여기에서는 SDG 확률적 경사 하강법으로 업데이트하는 부분
- 어떤 파라미터를 업데이트하는지는 optimizer 객체 선언시에 model.parameters()로 이미 넣어져 있음
- 저번 포스트의 코드에서는 각각의 데이터를 for문으로 각각 하나하나 기울기를 계산해, 가중치를 업데이트했지만, 만약 데이터셋이 많아지는 경우 해당 방법은 시간이 매우 오래 걸림, 여기 torch의 SGD를 사용할 떄는 batch (데이터 포인터들의 묶음, 여러개의 데이터포인트 뭉치) 를 같이 넣어 동시에 기울기를 구함
추론, 검증
with torch.no_grad():
추론 및 검증에서는 autograd 쓸 이유 없음 > 기능끄기
y_pred = model(hour_var)
임의로 설정한 input인 hour_var 텐서로 output을 추론 y_pred에 저장
print("Prediction (after training)", 4, model(hour_var).item())
model(hour_var).item()
결과인 텐서의 요소가 하나기에 .item()을 사용해 순수한 숫자 float로 변형
(tensor는 자체 객체라 출력, 외부 함수와 호환 힘들 떄 있다. 추가로 item은 요소가 하나일때만 사용가능)
전체 코드
수업에서 사용한 코드를 살짝쿵 수정했는데 거이 같다. (복붙과정에서 들여쓰기는 날라갔는데 귀찮아서 그냥 냅둠)
'vision,deep learning > PyTorchZeroToAll (in English) Review' 카테고리의 다른 글
| PyTorch Zero To All - 06 Logistic Regression Review (0) | 2025.05.14 |
|---|---|
| PyTorch Zero To All - 04 Back-propagation and Autograd Review (0) | 2025.05.11 |
| PyTorch Zero To All - 03 Gradient Descent exercise (0) | 2025.05.09 |
| PyTorch Zero To All - 03 Gradient Descent Review (0) | 2025.05.08 |
| PyTorch Zero To All - 02 Linear Model Review (0) | 2025.05.08 |