Python(Colab) 파이토치(Pytorch) + 단항 선형회귀 해보기

2023. 6. 18. 20:21파이썬/머신러닝 및 딥러닝

1개 입력 / 1개 출력 

참고사이트

https://rabo0313.tistory.com/entry/pytorch-torchmanualseed

 

 

[Pytorch] torch.manual_seed()

random seed 란 ? numpy 에서도 사용했던 random seed 5개의 난수를 생성 한다고 하면 우리는 np.random.rand(5)로 난수를 생성한다. 연달아서 np.random.rand(5)를 실행한다면 아래처럼, 생성할때마다 매번 서로 다

rabo0313.tistory.com

1. 기초설정

 

import torch
import torch.nn as nn #신경망 모듈
import torch.optim as optim # 기울기와 절편을 학습시키는 알고리즘
import matplotlib.pyplot as plt
 
torch.manual_seed(10)

 

2. 예제 데이터 만들기

 

x_train = torch.FloatTensor([[1],[2],[3]])
y_train = torch.FloatTensor([[2],[4],[6]])


print(x_train)
print(x_train.shape)
print(y_train)
print(y_train.shape)

 

3. 예제 데이터 시각화

plt.figure(figsize=(8,5))
plt.scatter(x_train,y_train)

 

 

4. 선형회귀 모델 셋팅

# H= Wx+b

model = nn.Linear(1,1) # 빈 모델
print(model)  # Linear(in_features=1, out_features=1, bias=True) #in입력 /out 출력 /bias=편향(절편)
 
 
print(list(model.parameters()))   #지금 내가 가지고 있는 기울기와 bias(절편)를 보여준다.
 
✔️ 해석
1. input이 1개이고, output이 1개인 선형 회귀 모델을 셋팅
2. list(model.parameters()))로 현재 테스트로 만들어진 기울기와 절편을 확인할 수 있다.

 

5. 비용함수를 이용 (단순 선형회귀이때문에 오차의 최소를 찾기 위해서)

 

y_pred = model(x_train)
print(y_pred)
 

 

6. 오차율 구하기

MSE

# MSE구하는 함수 모양 특이🔴
loss = nn.MSELoss()(y_pred,y_train)
loss
 

 

7. 경사하강법 (비용함수 최적화)

✔️ 경사하강법

*  Gradient Descent
* 선형회귀:실제값과 가장 비슷한 기울기와 절편을 찾는게 최종목표
* 비용함수의 값을 최소로 하는 기울기와 절편을 찾는 알고리즘을 옵티마이저 알고리즘이라고함
* 최적화 알고리즘이라고 부르기도 한다.
* 옵티마이저 알고리즘을 통해 w(기울기)와 b(절편)을 찾아내는 과정을 학습이라 부른다.
* 경사 하강법은 가장 기본적인 옵티마이저 알고리즘

출처 https://i.imgur.com/0fW4LTG.png

 

8. 경사하강법 적용하기

#랜덤하게 데이터를 뽑아서 학습하는 경사하강법 알고리즘 중 1개
#학습율(Learning Rate): 한 번 움직이는 거리 (increment step)

optimizer = optim.SGD(model.parameters(),lr=0.01)
lr: 학습율을 의미하며 그래프가 한번에 움직일 거리를 정하는 것
loss = nn.MSELoss()(y_pred,y_train)
 
#🔴 3개가 세트처럼 사용
optimizer.zero_grad() # 옵티마이저가 가진 기울기, 절편을 초기화 시키는 것
loss.backward() # 역전파가 일어나게 된다. 비용 함수를 미분을 취해서 기울기와 절편을 새롭게 찾아내는 것
optimizer.step() #현재 W와 b를 업데이트

 

학습한 기울기 확인

 

#바뀐 기울기 확인.
print(list(model.parameters()))
# before ) tensor([[-0.0838]],[-0.0343])
# after ) tensor([[0.1120],[0.0498])

 

9. 반복 학습시키기

반복 훈련을 하면서 틀린 W(기울기),b(절편)의 오차를 계속 줄여나간다.

epoch: 반복 훈련 횟수를 의미

 

epochs =1000

for epoch in range(epochs+1):
    y_pred = model(x_train)
    loss = nn.MSELoss()(y_pred,y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 100 == 0:
        print(f'Epoch{epoch}/{epochs} // Loss{loss:.6f}')
 

 

 

10. 최적화 된 기울기와 절편 확인

 

print(list(model.parameters()))
 
(1.9974) * x  +0.0060 = y 의미

 

728x90