파이토치 신경망 모듈 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() 메서드를 호출하면 된다.
'pytorch' 카테고리의 다른 글
파이토치 주요 특징 (0) | 2024.09.30 |
---|---|
붓꽃 데이터셋을 분류하는 다층 퍼셉트론 만들기 (0) | 2024.09.30 |
로컬 파일에서 데이터셋 만들기 (0) | 2024.09.30 |
셔플, 배치, 반복 (0) | 2024.09.30 |
파이토치 입력 파이프라인 구축 (0) | 2024.09.30 |