본문 바로가기

pytorch

파이토치로 신경망 모델 만들기

파이토치 신경망 모듈 torch.nn

import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
import torch

from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader

X_train = np.arange(10, dtype='float32').reshape((10,1))
y_train = np.array([1.0, 1.3, 3.1, 2.0, 5.0, 6.3, 6.6, 7.4, 8.0, 9.0], dtype='float32')

plt.plot(X_train, y_train, 'o', markersize = 10)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

X_train_norm = (X_train - np.mean(X_train)) / np.std(X_train)
X_train_norm = torch.from_numpy(X_train_norm)

y_train = torch.from_numpy(y_train).float()

train_ds = TensorDataset(X_train_norm, y_train)

batch_size = 1
train_dl = DataLoader(train_ds, batch_size, shuffle=True)

torch.manual_seed(1)
weight = torch.randn(1)
weight.requires_grad_()
bias = torch.zeros(1, requires_grad = True)

def model(xb):
    return xb @ weight + bias

def loss_fn(input, target):
    return (input - target).pow(2).mean()

learning_rate = 0.001
num_epochs = 200
log_epochs = 10

for epoch in range(num_epochs):
    for x_batch, y_batch in train_dl:
        pred = model(x_batch)
        loss = loss_fn(pred, y_batch.long())
        loss.backward()
    with torch.no_grad():
        weight -= weight.grad * learning_rate
        bias -= bias.grad * learning_rate
        weight.grad.zero_()
        bias.grad.zero_()
    
    if epoch % log_epochs==0:
        print(f'에포크 {epoch} 손실 {loss.item():.4f}')


loss_fn = nn.MSELoss(reduction='mean')
input_size = 1
output_size = 1
model = nn.Linear(input_size, output_size)
optimizer =torch.optim.SGD(model.parameters(), lr = learning_rate)

for epoch in range(num_epochs):
    for x_batch, y_batch in train_dl:
        # 1. 예측을 생성합니다.
        pred = model(x_batch)[:, 0]

        # 2. 손실을 계산합니다.
        loss = loss_fn(pred, y_batch)

        # 3. 그레이디언트를 계산합니다.
        loss.backward()

        # 4. 그레이디언트를 사용해 파라미터를 업데이트합니다.
        optimizer.step()

        # 5. 그레이디언트를 0으로 초기화합니다.
        optimizer.zero_grad()

    if epoch % log_epochs==0:
        print(f'에포크 {epoch}  손실 {loss.item():.4f}')

사용자 정의 함수 loss_fn() 을 만들고 확률적 경사 하강법을 적용하여 모듈을 훈련했음, 

하지만 손실 함수 작성과 그레이디언트 업데이트는 프로젝트마다 반복되는 작업

torch.nn 모듈은 여러 가지 손실 함수를 제공하여 torch.optim 모듈은 계산된 그레이디언트를 기반으로 파라미터를 업데이트하는 데 가장 널리 사용되는 최적화 알고리즘을 지원한다.

모델 훈련을 위해 optimizer 객체의 step() 메서드를 호출하면 된다.