pytorch의 구현체들은 모델을 생성할 때 대부분 Class를 사용함
<목차>
1. 모델을 Class로 구현
2. 단순 선형 회귀 Class로 구현
3. 다중 선형 회귀 Class로 구현
모델을 Class로 구현
# 모델을 선언 및 초기화. 단순 선형 회귀이므로 input_dim=1, output_dim=1.
model = nn.Linear(1,1)
위를 Class로 구현시
class LinearRegressionModel(nn.Module): # torch.nn.Module을 상속받는 파이썬 클래스
def __init__(self): #
super().__init__()
self.linear = nn.Linear(1, 1) # 단순 선형 회귀이므로 input_dim=1, output_dim=1.
def forward(self, x):
return self.linear(x)
model = LinearRegressionModel()
- class 형태의 모델은 nn.Module을 상속받음
- __init__()에서 모델의 구조와 동작을 정의하는 생성자 정의 (객체가 가지는 속성값을 초기화하는 역할. 객체가 생성될 때 자동호출)
- super()을 부르면 여기서 만든 클래스는 nn.Module 클래스의 속성을 가지고 초기화 됨
- forward() 함수는 모델이 학습데이터를 받아서 forward 연산을 진행시키는 함수로, model 객체를 데이터와 함께 호출해서 자동으로 실행됨
단순 선형 회귀 Class로 구현
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(1)
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
# 모델을 선언 및 초기화. 단순 선형 회귀이므로 input_dim=1, output_dim=1.
model = LinearRegressionModel()
# optimizer 설정. 경사 하강법 SGD를 사용하고 learning rate를 의미하는 lr은 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 전체 훈련 데이터에 대해 경사 하강법을 2,000회 반복
nb_epochs = 2000
for epoch in range(nb_epochs+1):
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction, y_train) # <== 파이토치에서 제공하는 평균 제곱 오차 함수
# cost로 H(x) 개선하는 부분
# gradient를 0으로 초기화
optimizer.zero_grad()
# 비용 함수를 미분하여 gradient 계산
cost.backward() # backward 연산
# W와 b를 업데이트
optimizer.step()
if epoch % 100 == 0:
# 100번마다 로그 출력
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
다중 선형 회귀 Class로 구현
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(1)
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(3, 1)
def forward(self, x):
return self.linear(x)
# 데이터
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]])
# 모델을 선언 및 초기화. 단순 선형 회귀이므로 input_dim=1, output_dim=1.
model = LinearRegressionModel()
# optimizer 설정. 경사 하강법 SGD를 사용하고 learning rate를 의미하는 lr은 0.01
optimizer = torch.optim.SGD(model.parameters(), lr= 1e-5)
# 전체 훈련 데이터에 대해 경사 하강법을 2,000회 반복
nb_epochs = 2000
for epoch in range(nb_epochs+1):
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction, y_train) # <== 파이토치에서 제공하는 평균 제곱 오차 함수
# cost로 H(x) 개선하는 부분
# gradient를 0으로 초기화
optimizer.zero_grad()
# 비용 함수를 미분하여 gradient 계산
cost.backward() # backward 연산
# W와 b를 업데이트
optimizer.step()
if epoch % 100 == 0:
# 100번마다 로그 출력
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
'전공공부 > 인공지능' 카테고리의 다른 글
Softmax Classification (0) | 2022.07.27 |
---|---|
Mini Batch 경사하강법, Data Load, Custom Dataset (0) | 2022.07.27 |
Multivariable Linear regression : Pytorch, nn.module로 구현 (0) | 2022.07.27 |
Linear regression: Pytorch, nn.module로 구현 (0) | 2022.07.27 |
Tensor manipulation -2 (0) | 2022.07.27 |