반응형

선형 회귀를 Pytorch로 구현하겠습니다.

 

이 글을 보시기 전에 아래 링크를 보시는 것을 추천드립니다.

 

https://coding-yoon.tistory.com/50?category=825914

 

[딥러닝] 선형 회귀(Linear Regression)

지도 학습에는 대표적으로 세가지가 있습니다. 1. 선형 회귀 ( Linear Regression ) : 3월 : 60점, 6월 : 70점, 9월 : 80점이라면, 12월은 몇 점일까? 2. 이진 분류 ( Binary Classification ) : [0, 1], [True, F..

coding-yoon.tistory.com

최대한 선형 회귀식처럼 보기 쉽게끔 코딩하였습니다.

 

아래 코딩과 비교하면서 봐보세요.

 

# 선형 회귀
import torch
import torch.nn as nn  # 선형회귀를 불러오기 위한 라이브러리
import torch.optim as optim  # 경사하강법를 불러오기 위한 라이브러리
import torch.nn.init as init  # 텐서의 초기값을 구하기 위한 라이브러리

data = 1000  # 몇 개의 데이터를 만들 것인가...
epoch = 500  # 몇 번을 거쳐 돌릴 것인가... ( = 데이터 전체를 학습에 한 번 사용하는 주기 )
W = 4  # weight ( = 기울기 )
b = 5  # bias  ( = 절편 )

x = init.uniform_(torch.Tensor(data, 1), -10, 10)  # Input data
y = W * x + b  # Output data

model = nn.Linear(1, 1)  # 선형회귀 모델 ( Input 특성의 수, 결과로 나오는 특성의 수 )
cost_function = nn.MSELoss()  # MSE : 제곱의 평균 ( = Mean of squares )

# optim : 최적화 함수 ( = optimizer)
# SGD : 경사하강법 ( = stochastic gradient descent )
# model.parameters() : model 의 parameter(w, b) 를 전달
# lr : 학습률 ( = learning rate )
optimizer = optim.SGD(model.parameters(), lr=0.01)

for i in range(epoch):
    optimizer.zero_grad()  # 처음엔 gradient 값이 없기 때문에 0으로 초기화
    H_x = model(x)  # hypothesis
    loss = cost_function(H_x, y)  # cost(=loss) 구하기

    loss.backward()  # W, b에 대한 기울기 계산
    optimizer.step()  # optimizer 호출, 경사하강법을 사용하여 업테이트

    # 10번 씩 수행하면 cost 출력
    if i % 10 == 0:
        print("Cost(=loss) :", loss.item())

result = list(model.parameters())
print("W :", result[0].item())
print("b :", result[1].item())

 

# 결과
Cost(=loss) : 814.8699340820312
Cost(=loss) : 12.195707321166992
Cost(=loss) : 8.143980026245117
Cost(=loss) : 5.438344955444336
Cost(=loss) : 3.6315879821777344
Cost(=loss) : 2.4250807762145996
Cost(=loss) : 1.6194065809249878
Cost(=loss) : 1.081398606300354
Cost(=loss) : 0.7221314907073975
Cost(=loss) : 0.4822206497192383
Cost(=loss) : 0.3220142424106598
Cost(=loss) : 0.21503257751464844
Cost(=loss) : 0.14359332621097565
Cost(=loss) : 0.09588787704706192
Cost(=loss) : 0.06403134018182755
Cost(=loss) : 0.042758237570524216
Cost(=loss) : 0.02855268307030201
Cost(=loss) : 0.01906675659120083
Cost(=loss) : 0.012732233852148056
Cost(=loss) : 0.008502312004566193
Cost(=loss) : 0.005677602719515562
Cost(=loss) : 0.003791437717154622
Cost(=loss) : 0.0025317480321973562
Cost(=loss) : 0.001690658857114613
Cost(=loss) : 0.001128957374021411
Cost(=loss) : 0.0007538488134741783
Cost(=loss) : 0.0005033717607147992
Cost(=loss) : 0.0003361686831340194
Cost(=loss) : 0.00022449734387919307
Cost(=loss) : 0.0001499166974099353
Cost(=loss) : 0.00010010885307565331
Cost(=loss) : 6.684719119220972e-05
Cost(=loss) : 4.463006553123705e-05
Cost(=loss) : 2.9802462449879386e-05
Cost(=loss) : 1.990168311749585e-05
Cost(=loss) : 1.3289816706674173e-05
Cost(=loss) : 8.872347279975656e-06
Cost(=loss) : 5.9264275478199124e-06
Cost(=loss) : 3.959625701099867e-06
Cost(=loss) : 2.6436666757945204e-06
Cost(=loss) : 1.766238597156189e-06
Cost(=loss) : 1.1812345519501832e-06
Cost(=loss) : 7.882306931605854e-07
Cost(=loss) : 5.261869091555127e-07
Cost(=loss) : 3.516942399528489e-07
Cost(=loss) : 2.3484382438709872e-07
Cost(=loss) : 1.5710433842741622e-07
Cost(=loss) : 1.0491751822883089e-07
Cost(=loss) : 6.964684473587113e-08
Cost(=loss) : 4.667232644806063e-08
W : 3.9999990463256836
b : 4.999824047088623

Process finished with exit code 0

 

아래 결과를 자세히 보시면 중간까지는 cost의 값이 굉장히 작다가 후반부에 cost의 값이 증가하는 것을 확인할 수 있습니다. 

 

모델링을 할 때 유의사항 중 epoch를 무조건 많이 준다하여, 학습이 잘되는 것이 아닙니다.

 

데이터 처리, 모델링, epoch 등을 모두 적절하게 적용하여야 합니다.

728x90
반응형

+ Recent posts