이전 챕터까지는 가설, 비용 함수를 직접 정의해서 모델을 구현했었음
이번에는 Pytorch에서 이미 구현되어 있는 함수들을 불러와서 더 쉽게 회귀 모델들을 구현해보자!
1. 단순 선형 회귀 구현
아래 두 함수를 활용할 예정!
- `nn.Linear()` : 선형회귀 모델이 구현되어있는 함수
- `nn.functional.mse_loss()` : 평균제곱오차(MSE) 계산이 구현되어있는 함수
# 사용 예시 미리보기
import torch.nn as nn
model = nn.Linear(input_dim, output_dim) # 선형회귀모델
import torch.nn.functional as F
cost = F.mse_loss(prediction, y_train) # 평균제곱오차
데이터 준비, 가설 선언
- 이전과 동일하게 정답 함수는 $y=2x$이고, 그 함수로 만든 훈련 데이터(샘플 3개)를 준비
- 가설 선언을 직접 하지 않고, 파이토치의 `nn.Linear()` 모델 사용
- `(입력 차원, 출력 차원)`을 인자로 입력 (ex. 단순선형회귀니까 `(1,1)`)
- 🆚이전에는 `hypothesis = x_train.matmul(W) + b`로 직접 가설 식 선언했었음
- 모델 객체에 `.parameters()`라는 함수를 쓰면 가중치(W), 편향(b) 반환해줌
- 알아서 랜덤 초기화 되어있음 & 학습 대상이니까 `requires_grad=True` 설정되어있음
옵티마이저 준비, 경사하강법 구현
- 이번에도 SGD 사용하는데, 가중치를 `model.parameters()` 사용해서 전달
- 🆚이전에는 `SGD([W,b], lr=0.01)`로 전달했었음
- 가설은 `model` 객체에 훈련 데이터 입력만 하면 됨
- = `model.forward(x_train)`와 동일한 작업을 수행함
- 비용함수도 `F.mse_loss` 함수를 그대로 사용해서 선언
- 🆚이전에는 `cost = torch.mean((hypothesis - y_train) ** 2)`로 직접 계산식 작성했었음
- 역시 학습되면서 cost = 0에 가까워지고, 가중치도 정답함수의 것과 매우 가까워짐 (W=2, b=0)
- 그리고 NEW 입력에 대한 예측값도 잘 출력함
- `model(new_var)` : 모델 객체에 입력 데이터(텐서)를 넣어주기만 하면 forward 연산을 수행함!
2. 다중 선형 회귀 구현
단순 선형 회귀와 동일한 방식으로 구현하는데, `nn.Linear()`에 입력하는 인자만 바꾸면 됨!
데이터 준비, 가설 선언
- 마찬가지로 `nn.Linear()` 모델 사용하는데, 다중선형회귀니까 `(3,1)`로 입력!
옵티마이저 준비, 경사하강법 구현
- 학습률을 그대로 0.01을 쓰면 기울기가 발산함 ⇒ 더 작은 `1e-5`로 변경
- 나머지는 전부 동일한 코드!
- 마찬가지로 cost, 가중치의 변화 확인 가능
- NEW 입력에 대한 예측도 잘 함
3. 모델을 클래스로 구현
그런데, 파이토치는 대부분 모델을 클래스(Class)로 구현해둠
따라서, 앞서 배운 선형 회귀를 "클래스만으로 구현"해보자!
단순 선형 회귀 클래스
- 1) 클래스 형태의 모델은 반드시 `nn.Module` 을 상속받는다
- 2) `__init__()` 함수 : 객체 생성 시 자동으로 호출되는 부분으로, 여기에 모델 구조와 동작을 정의해둠
- `super().__init__()` : 부모인 nn.Module 클래스의 속성들로 초기화하는 부분
- `self.linear = nn.Linear(1, 1)` : 단순선형회귀 모델을 정의해두는 부분
- 3) `forward(x)` 함수 : 모델이 학습 데이터를 입력하면 그걸로 forward 연산을 수행하는 함수
- ex) `model(x)` 처럼 호출하면 자동으로 실행됨
- 위(1~3)처럼 구현해둔 클래스를 아래와 같이 불러와서 쓰는 것!
model = LinearRegressionModel() # 클래스 객체 생성
다중 선형 회귀 클래스
- 단순 선형 회귀 클래스와 마찬가지 방식으로 구현 (역시 `nn.Linear`의 인자값만 달라짐)
- 위처럼 구현해둔 클래스를 아래와 같이 불러와서 쓰는 것!
model = MultivariateLinearRegressionModel() # 클래스 객체 생성
이제 클래스로 구현해둔 모델을 사용해서 다시 훈련 & 평가 진행해보자!
4. 단순 선형 회귀 구현 by 클래스
- 클래스 객체(`LinearRegressionModel`)를 가져다 쓰는 것 이외에는 전부 동일!
5. 다중 선형 회귀 구현 by 클래스
- 클래스 객체(`MultivariateLinearRegressionModel`)를 가져다 쓰는 것 이외에는 전부 동일!
👉지금은 클래스 내부에 `nn.Linear` 객체로 선형층 하나만 추가했는데, 나중에 여기다가 다른 층들을 더 쌓아서 복잡한 모델을 구현하는 게 아닐까 싶다!
🙏References
- 유원준, 안상준 님의 <딥러닝 파이토치 교과서 Wikidocs> (https://wikidocs.net/book/2788) 를 공부하고 정리한 내용입니다. (이미 알고 있는 머신러닝 관련 기본 지식들은 간소화 또는 생략하고 포스팅하였습니다)
'ML & DL > 딥러닝 기초' 카테고리의 다른 글
[Pytorch+딥러닝] 3-4. 미니 배치와 데이터 로더 (0) | 2025.02.20 |
---|---|
[Pytorch+딥러닝] 3-2. 다중 선형 회귀 (0) | 2025.02.18 |
[Pytorch+딥러닝] 3-1. 선형 회귀와 자동 미분 (0) | 2025.02.17 |
[Pytorch+딥러닝] 1. Pytorch 기초 (0) | 2025.02.05 |
[Keras] Sequential API vs. Functional API 비교 (0) | 2025.02.03 |