[PyTorch] Linear Regression
Linear Regression (선형 회귀)
sklearn libaray의 dataset을 기준으로 코드를 작성하고 연습을 진행하였다.
큰 흐름을 말하자면,
-
Dataset and Data Preprocessing
-
Model Declaration and Initialization.
-
Cost function Declaration and Gradient(Optimizer) Declaration
-
Training
-
Visualization
CODE
# Declare the required library
import numpy as np # Data libaray
import matplotlib.pyplot as plt # Visualization
import torch # torch libaray
import torch.nn as nn # torch neural network libaray
from sklearn import datasets # Dataset Load
# Data Load
x_numpy, y_numpy = datasets.make_regression(n_samples=100, n_features=1, noise=20, random_state=1)
x = torch.from_numpy(x_numpy.astype(np.float32)) # neural network에 올리기 위한 형변환.
y = torch.from_numpy(y_numpy.astype(np.float32)) # neural network에 올리기 위한 형변환.
y = y.view(y.shape[0],1) # tensor의 size를 100,1로 변경한다.
# 와... y_numpy에 x_numpy 넣어줘서 1시간걸려서 찾았네;;
# 생각해보면 y가 이상하다는거 알았으면 바로 여기부터 볼것이지....어이가 없네
x.shape, y.shape
(torch.Size([100, 1]), torch.Size([100, 1]))
# model
n_samples, n_features = x.shape
input_size = n_features
output_size = 1
model = nn.Linear(input_size, output_size) # model은 nn.Linear모델을 사용하였다. 지금은 내가 답을 알고 선택하기에 이렇지만, 차후에는 데이터의 특성을 파악하고 해야한다.
# loss and optimizer
criterion = nn.MSELoss() # cost fucntion은 MSE(Mean Square Error를 선택했다. 특정 값이상에서는 오차가 커지므로 학습하기 무난하다고 생가했는데. 사실 그냥 골랐디.)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 최적화(optimizer)로는 SGD(Stochastic gradient descent)를 선택했는데 Adam을 하는것도 무난한데, Linear이고 처음이니깐 이거 했다. 별 이유는 없다.
# training loop
epochs = 100
for epoch in range(epochs):
# forward pass and loss
y_pred = model(x) # 모델을 학습시켜서 예측값을 뱉어낸다.
loss = criterion(y_pred, y) # 정답과 학습시켜서 나온 예측값의 오차를 측정한다.
# backward pass
loss.backward() # 오차를 줄인다.
# update
optimizer.step() # 예측값을 업데이트한다.
optimizer.zero_grad() # 다음학습에 영향을 받으면 안되니깐 다시 초기화.
if (epoch+1) % 10 == 0:
print(f"epoch: {epoch+1}, loss = {loss.item():.4f} ")
# plot
predicted = model(x).detach().numpy()
# plt.subplot(121)
plt.plot(x_numpy, y_numpy, 'ro')
# plt.subplot(122)
plt.plot(x_numpy, predicted, 'b')
plt.show()
epoch: 10, loss = 4349.8877 epoch: 20, loss = 3245.0125 epoch: 30, loss = 2445.9539 epoch: 40, loss = 1867.4298 epoch: 50, loss = 1448.1460 epoch: 60, loss = 1143.9843 epoch: 70, loss = 923.1429 epoch: 80, loss = 762.6686 epoch: 90, loss = 645.9738 epoch: 100, loss = 561.0574
댓글남기기