Deep Learning with PyTorch/Linear Regression
[Linear Regression] 클래스로 파이토치 모델 구현하기
JinWooHong Dev
2021. 8. 20. 10:14
1. 모델을 클래스로 구현하기
앞서 단순 선형 회귀 모델은 다음과 같이 구현했다.
In [4]:
import torch
import torch.nn as nn
In [5]:
model = nn.Linear(1, 1)
이를 클래스로 구현하면 다음과 같다.
In [6]:
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
In [7]:
model = LinearRegressionModel()
위와 같은 클래스를 사용한 모델 구현 방식은 대부분의 파이토치 구현체에서 사용되고 있는 방식으로 반드시 숙지할 필요가 있다.
클래스(class) 형태의 모델은 nn.Module을 상속받는다. 그리고 __init__()에서 모델의 구조와 동적을 정의하는 생성자를 정의한다. 이는 파이썬에서 객체가 갖는 속성값을 초기화하는 역할로, 객체가 생성될 때 자동으로 호출된다. super() 함수를 부르면 여기서 만든 클래스는 nn.Module 클래스의 속성들을 가지고 초기화된다. forward() 함수는 모델이 학습데이터를 입력받아서 forward 연산을 진행시키는 함수다. 이 forward() 함수는 model 객체를 데이터와 함께 호출하면 자동으로 실행이 된다. 예를 들어 model이란 이름의 객체를 생성 후, model(입력 데이터)과 같은 형식으로 객체를 호출하면 자동으로 forward 연산이 수행된다.
- H(x) 식에 입력 x로부터 예측된 y를 얻는 것을 forward 연산이라고 한다.
In [8]:
model = nn.Linear(3, 1)
In [9]:
class MultivariateLinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(3, 1)
def forward(self, x):
return self.linear(x)
In [10]:
model = MultivariateLinearRegressionModel()
2. 단순 선형 회귀 클래스로 구현하기
이제 모델을 클래스로 구현한 코드를 본다. 달라진 점은 모델을 클래스로 구현했다는 점이다.
In [11]:
import torch
import torch.nn as nn
import torch.nn.functional as F
In [12]:
torch.manual_seed(1)
Out[12]:
<torch._C.Generator at 0x7fec1969a2f0>
In [13]:
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
In [14]:
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
In [15]:
model = LinearRegressionModel()
In [16]:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
In [17]:
nb_epochs = 2000
for epoch in range(nb_epochs+1):
prediction = model(x_train)
cost = F.mse_loss(prediction, y_train)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
Epoch 0/2000 Cost: 13.103541
Epoch 100/2000 Cost: 0.002791
Epoch 200/2000 Cost: 0.001724
Epoch 300/2000 Cost: 0.001066
Epoch 400/2000 Cost: 0.000658
Epoch 500/2000 Cost: 0.000407
Epoch 600/2000 Cost: 0.000251
Epoch 700/2000 Cost: 0.000155
Epoch 800/2000 Cost: 0.000096
Epoch 900/2000 Cost: 0.000059
Epoch 1000/2000 Cost: 0.000037
Epoch 1100/2000 Cost: 0.000023
Epoch 1200/2000 Cost: 0.000014
Epoch 1300/2000 Cost: 0.000009
Epoch 1400/2000 Cost: 0.000005
Epoch 1500/2000 Cost: 0.000003
Epoch 1600/2000 Cost: 0.000002
Epoch 1700/2000 Cost: 0.000001
Epoch 1800/2000 Cost: 0.000001
Epoch 1900/2000 Cost: 0.000000
Epoch 2000/2000 Cost: 0.000000
3. 다중 선형 회귀 클래스로 구현하기
In [18]:
torch.manual_seed(1)
Out[18]:
<torch._C.Generator at 0x7fec1969a2f0>
In [19]:
x_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
In [20]:
class MultivariateLinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(3, 1)
def forward(self, x):
return self.linear(x)
In [21]:
model = MultivariateLinearRegressionModel()
In [22]:
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)
In [25]:
nb_epochs = 2000
for epoch in range(nb_epochs+1):
prediction = model(x_train)
cost = F.mse_loss(prediction, y_train)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
Epoch 0/2000 Cost: 31667.599609
Epoch 100/2000 Cost: 0.225993
Epoch 200/2000 Cost: 0.223911
Epoch 300/2000 Cost: 0.221941
Epoch 400/2000 Cost: 0.220059
Epoch 500/2000 Cost: 0.218271
Epoch 600/2000 Cost: 0.216575
Epoch 700/2000 Cost: 0.214950
Epoch 800/2000 Cost: 0.213413
Epoch 900/2000 Cost: 0.211952
Epoch 1000/2000 Cost: 0.210559
Epoch 1100/2000 Cost: 0.209230
Epoch 1200/2000 Cost: 0.207967
Epoch 1300/2000 Cost: 0.206762
Epoch 1400/2000 Cost: 0.205618
Epoch 1500/2000 Cost: 0.204529
Epoch 1600/2000 Cost: 0.203481
Epoch 1700/2000 Cost: 0.202486
Epoch 1800/2000 Cost: 0.201539
Epoch 1900/2000 Cost: 0.200634
Epoch 2000/2000 Cost: 0.199770