[딥러닝 기초] 선형회귀 모델의 개선

[딥러닝 기초] 선형회귀 모델의 개선

다음의 책을 공부하며 정리한 내용입니다

nn.Module 을 사용한 선형회귀 모델의 개선

: 파이토치에서 일부 모델(ex. 선형회귀모델)들은 이미 nn.Module의 형태로 편리하게 쓸 수 있도록 구현되어있다.

즉, 우리가 기존에 구현했던 선형회귀 수식

  • y_hat = (w * x_train) + b
  • y_hat = x_train.matmul(w) + b

이는 아래와 같이 변경할 수 있다.

  • model = nn.Linear(1, 1)
  • model = nn.Linear(3, 1)

: 이때 nn.Linear()선형회귀 모델을 의미하며 왼쪽부터 순서대로 input dimension, output dimension이다.

input_dim : 가중치 w의 개수

output_dim : 가중치 w의 길이

nn.Linear 모델 사용해보기

  • nn.Linear( )에는 가중치w와 편향b가 저장되어있다.
  • 이는 model.parameters( )로 불러올 수 있다.
1
2
3
4
5
6
7
8
# 모델을 선언 및 초기화. 단순 선형 회귀이므로 input_dim=1, output_dim=1.
import torch
import torch.nn as nn

model = nn.Linear(1,1)

# 출력되는 첫번째값이 w, 두번째값이 b. 랜덤 초기화되어있는 상태이다.
print(list(model.parameters()))
1
2
3
4
[결과]
[Parameter containing:
tensor([[0.5153]], requires_grad=True), Parameter containing:
tensor([-0.4414], requires_grad=True)]

기존 선형회귀 코드의 개선

: 기존 선형회귀 코드를 다음과 같이 개선할 수 있다.

개선 1

1
2
3
# 최종코드
import torch
torch.manual_seed(1)

torch.nn 까지 import

1
2
3
4
# 최종코드
import torch
import torch.nn
torch.manual_seed(1)

개선 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for epoch in range(1000):

# 새 학습값
y_hat = (w * x_train) + b

# MSE함수통한 비용 계산
cost = torch.mean((y_train - y_hat) ** 2)

# optimizer로 w,b 학습시킴으로서 y_hat 개선
# gradient를 0으로 초기화
optimizer.zero_grad()
# 비용 함수를 미분하여 gradient 계산
cost.backward()
# W와 b를 업데이트
optimizer.step()

nn.Linear( )로 선언한 model로 y_hat 계산

F.mse_loss(prediction, y_train) 파이토치에서 제공하는 평균제곱함수로 cost 계산

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
model = nn.Linear(1, 1)

for epoch in range(1000):

# 새 학습값
y_hat = model(x_train)

# MSE함수통한 비용 계산
cost = F.mse_loss(y_hat, y_train)

# optimizer로 w,b 학습시킴으로서 y_hat 개선
# gradient를 0으로 초기화
optimizer.zero_grad()
# 비용 함수를 미분하여 gradient 계산
cost.backward()
# W와 b를 업데이트
optimizer.step()

# 임의의 입력 4를 선언
new_var = torch.FloatTensor([[4.0]])

# 입력한 값 4에 대해서 예측값 y를 리턴받아서 pred_y에 저장
pred_y = model(new_var) # forward 연산

# y = 2x 이므로 입력이 4라면 y가 8에 가까운 값이 나와야 제대로 학습이 된 것
print("훈련 후 입력이 4일 때의 예측값 :", pred_y)
1
2
[결과]
훈련 후 입력이 4일 때의 예측값 : tensor([[7.9989]], grad_fn=<AddmmBackward>)
  • 위의 코드로 학습한 모델 model은 x_train, y_train에 대해 학습된 값 w,b 를 저장하고 있다.
  • 학습된 모델 model을 활용해 새로운 값 x_new 에 대한 예측값 y_pred를 얻을 수 있다.

댓글