import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.init as init
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
# 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)
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)
import matplotlib.pyplot as plt
plt.plot(loss_array)
plt.show()
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()