코드 인사이드[Code_Inside]

딥러닝 모델 학습 과정, model.eval() 본문

DL

딥러닝 모델 학습 과정, model.eval()

code_inside_bit 2024. 2. 6. 12:03

* 해당 내용은 '딥러닝 파이토치 교과서' 를 개인 공부 목적으로 정리한 것임

  • 모델 학습

모델을 학습 시킨다는 것은 입력값 x, 출력값 y 가

만약 y = wx+b 라는 관계식(함수)을 가진다면 loss가 최솟값을 갖도록 하는 가중치(w) 및 편향(b)의 값을 찾아 나가는 과정을 의미한다.

먼저 w,b에 임의의 값을 적용한 뒤 오차(실제값과 예측값의 차이)가 서서히 줄어들어 전역 최소점에 이를 때까지 파라미터(w,b)를 계속 수정한다.

학습 과정은 다음과 같다.

1. optimizer.zero_grad()

기울기 초기화 메서드

  • 새로운 기울기 값을 이전 기울기 값에 누적하여 계산하는 것은 RNN(순환 신경망) 모델을 구현할 때는 효과적이나 누적 계산이 필요하지 않는 모델인 경우 불필요함.
  • 따라서 기울기 값에 대한 누적 계산이 필요하지 않을 때는 입력 값을 모델에 적용하기 전에 optimizer.zero_grad() 메서드를 호출하여 미분값이 누적되지 않도록 초기화함

2. output = model(input)

입력 -> 출력 계산(전방향 학습)

3. loss = loss_fn(output,target)

손실함수 출력과 정답의 차이, 즉 오차 계산

4. loss.backward()

파이토치에서 기울기 계산시 사용함(역전파 과정)

5. optimizer.step()

기울기 업데이트

모델 훈련 코드 예시는 다음과 같다.

for epoch in range(100):
   yhat = model(x_train)
   loss = criterion(yhat,y_train)
   optimizer.zero_grad() # 오차가 중첩적으로 쌓이지 않도록 초기화함
   loss.backward()
   optimizer.step()

 


 

-model.train() : 훈련 데이터셋을 사용하여 모델 훈련을 진행

* 이때 드롭아웃(output)이 활성화됨

-model.eval() : 모델을 평가할 때는 모든 노드를 사용하겠다는 의미로 검증과 테스트 데이터셋 사용

두 메서드 모두를 선언해야 모델의 정확도를 높일 수 있음

 

model.eval() # 모델 평가
with torch.no_grad():
       valid_loss = 0
       
       for x,y in valid_dataloder:
           outputs = model(x)
           loss = F.cross_entropy(outputs,y.long().squeeze())
           valid_loss += float(loss)
           y_hat +- [output]
valid_loss = valid_loss / len(valid_loader)

 

* model.eval()에서 with torch.no_grad()을 사용하는 이유

파이토치는 모든 연산과 기울기 값을 저장한다. 하지만 검증 과정(혹은 테스트)에서는 과정에서는 역전파가 필요하지 않기 때문에

with torch.no_grad()를 사용하여 기울기값을 저장하지 않도록 함.

이와 같은 과정을 통해 기울기 값을 저장하고 기록하는데 필요한 메모리와 연산 시간을 최소화할 수 있음