import numpy as np
import torch
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X = iris['data']
y = iris['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1./3, random_state=1)
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
X_train_norm = (X_train - np.mean(X_train)) / np.std(X_train)
X_train_norm = torch.from_numpy(X_train_norm).float()
y_train = torch.from_numpy(y_train)
# 데이터가 텐서임 TensorDataset 의 사용
train_ds = TensorDataset(X_train_norm, y_train)
torch.manual_seed(1)
batch_size = 2
train_dl = DataLoader(train_ds, batch_size, shuffle=True)
두 개의 은닉층을 가진 모델의 정의
import torch.nn as nn
class Model(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super().__init__()
self.layer1 = nn.Linear(input_size, hidden_size)
self.layer2 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = self.layer1(x)
x = nn.Sigmoid(x)
x = self.layer2(x)
x = nn.Softmax(dim=1)(x)
return X
input_size = X_train_norm.shape[1]
hidden_size = 16
output_size = 3
model = Model(input_size, hidden_size, output_size)
모델의 정의
forward 함수에서 시그모이드 활성화 등의 지정,
손실 함수로는 크로스 엔트로피 손실의 사용, 옵티마이저의 지정
learing_rate = 0.001
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learing_rate)
num_epochs = 100
loss_hist = [0] * num_epochs
accuracy_hist = [0] * num_epochs
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()
optimizer.step()
optimizer.zero_grad()
loss_hist[epoch] += loss.item() * y_batch.size(0)
is_coreect = (torch.argmax(pred, dim=1) == y_batch).float()
accuracy_hist[epoch] += is_coreect.sum()
loss_hist[epoch] /= len(train_dl.dataset)
accuracy_hist[epoch] /= len(train_dl.dataset)
fig = plt.figure(figsize=(12, 5))
ax = fig.add_subplot(1, 2, 1)
ax.plot(loss_hist, lw=3)
ax.set_title('Training loss', size=15)
ax.set_xlabel('Epoch', size=15)
ax.tick_params(axis='both', which='major', labelsize=15)
ax = fig.add_subplot(1, 2, 2)
ax.plot(accuracy_hist, lw=3)
ax.set_title('Training accuracy', size=15)
ax.set_xlabel('Epoch', size=15)
ax.tick_params(axis='both', which='major', labelsize=15)
plt.tight_layout()
#plt.savefig('figures/12_09.pdf')
plt.show()
비용 함수의 선언
옵티마이저 선언, model.parameters() 가 뭔지 알아보자
loss, accuracy_hist 의 배열 미리 만들기
epoch 만큼의 반복, data_loader 로 받아온 배치 데이터의 반복 수행
loss.backward() 가 뭔지 알아보기
optimizer.step() 과 optimizer.zero_grad() 가 먼지 확인
테스트 데이터셋 모델 평가
# 테스트 데이터 확인
X_test_norm = (X_test - np.mean(X_train)) / np.std(X_train)
X_test_norm = torch.from_numpy(X_test_norm).float()
y_test = torch.from_numpy(y_test)
pred_test = model(X_test_norm)
correct = (torch.argmax(pred_test, dim=1) == y_test).float()
accuracy = correct.mean()
print(f'테스트 정확도: {accuracy:.4f}')
'pytorch' 카테고리의 다른 글
모델 파라미터를 저장하고 업데이트하기 위한 파이토치 텐서 객체 (0) | 2024.09.30 |
---|---|
파이토치 주요 특징 (0) | 2024.09.30 |
파이토치로 신경망 모델 만들기 (0) | 2024.09.30 |
로컬 파일에서 데이터셋 만들기 (0) | 2024.09.30 |
셔플, 배치, 반복 (0) | 2024.09.30 |