인공신경망 모델의 학습

  • 3Àå¿¡¼­ ¼³¸íÇÑ ºÎºÐÀ» Á¦¿ÜÇÏ°í ÁÖ¼®À» ´Þ¾Ò½À´Ï´Ù.
  • y = x^2+3

필요한 라이브러리 불러오기

In [0]:
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.init as init

데이터 생성

In [0]:
num_data = 1000
num_epoch = 10000

noise = init.normal_(torch.FloatTensor(num_data,1),std=1)
x = init.uniform_(torch.Tensor(num_data,1),-15,15)
y = (x**2) + 3 
y_noise = y + noise

모델, 손실 함수, 최적화 함수 설정

In [0]:
# 3ÀåÀÇ ¿¹½Ãó·³ ÇϳªÀÇ °ªÀÌ µé¾î°¡¼­ ÇϳªÀÇ °ªÀÌ ³ª¿À±â ¶§¹®¿¡ ¸ðµ¨ÀÇ Ã³À½°ú ³¡ Ư¼ºÀÇ °³¼ö´Â 1°³ÀÔ´Ï´Ù.

# https://pytorch.org/docs/stable/nn.html?highlight=sequential
# torch.nn.Sequential
# Sequential ¸ðµâÀº ´Ù¾çÇÑ ¸ðµâÀ» ´ãÀ» ¼ö ÀÖ´Â ÀÏÁ¾ÀÇ ¸®½ºÆ®¶ó°í º¸¸é µË´Ï´Ù.
# Sequential ¿¡ Á¤ÀÇµÈ ¼ø¼­´ë·Î ¿¬»êÀÌ ÁøÇàµÇ¸ç, ¸¹Àº ¿¬»êÀ» ¹­¾î¼­ Çѹø¿¡ °ü¸®ÇÒ ¼ö À־ Æí¸®ÇÕ´Ï´Ù.

# ¾Æ·¡ ÄÚµå´Â Ư¼ºÀÇ °³¼ö°¡ 1 -> 6 -> 10 -> 6 -> 1°³·Î º¯ÇÏ´Â Àΰø½Å°æ¸ÁÀÔ´Ï´Ù. 
# ¶ÇÇÑ ¼±Çüº¯È¯ ÀÌÈÄ È°¼ºÈ­ ÇÔ¼ö¸¦ ³Ö¾î ºñ¼±Çü¼ºÀÌ »ý±âµµ·Ï Çß½À´Ï´Ù.

model = nn.Sequential(
          nn.Linear(1,6),
          nn.ReLU(),
          nn.Linear(6,10),
          nn.ReLU(),
          nn.Linear(10,6),
          nn.ReLU(),
          nn.Linear(6,1),
      )

loss_func = nn.L1Loss()
optimizer = optim.SGD(model.parameters(),lr=0.0002)

모델의 학습

In [0]:
loss_array = []
for i in range(num_epoch):
    optimizer.zero_grad()
    output = model(x)
    
    loss = loss_func(output,y_noise)
    loss.backward()
    optimizer.step()
    
    loss_array.append(loss)

손실 그래프

In [5]:
import matplotlib.pyplot as plt

plt.plot(loss_array)
plt.show()

학습된 모델의 결과값과 실제 목표값의 비교

In [6]:
plt.figure(figsize=(10,10))
plt.scatter(x.detach().numpy(),y_noise,label="Original Data")
plt.scatter(x.detach().numpy(),output.detach().numpy(),label="Model Output")
plt.legend()
plt.show()
In [0]: