본문 바로가기
머신러닝 & 딥러닝

16. 데이터 로더

by 곽정우 2024. 6. 13.

1. 데이터 로더(DataLoader)

  • 데이터 양이 많을 때 배치 단위로 학습하는 방법

 

2. 손글씨 인식 모델 만들기

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
# 코랩에서 GPU 환경으로 변경

device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(device)

digits = load_digits()

x_data = digits['data']
y_data = digits['target']

print(x_data.shape)
print(y_data.shape)

# x_data 시각화해서 보기 

fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(14, 8))

for i, ax in enumerate(axes.flatten()): #flatten():배열을 한줄로 만듦
    ax.imshow(x_data[i].reshape((8, 8)), cmap='gray')
    ax.set_title(y_data[i])
    ax.axis('off')

# 데이터를 텐서형으로 변경

x_data = torch.FloatTensor(x_data)
y_data = torch.LongTensor(y_data)

print(x_data.shape)
print(y_data.shape)

x_train, x_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.2, random_state=2024)

print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)

loader = torch.utils.data.DataLoader(
    dataset=list(zip(x_train, y_train)),

    # 학습 사이즈를 64개로 설정
    batch_size=64,

    # 섞지 않으면 순서에 맞춰서 데이터 분할
    shuffle=True,

    # 데이터를 64개씩 자르는데 64개 이하일 경우, 마지막에 남는 데이터를 사용할 것인지 말 것인지.
    drop_last=False
)

# 배치단위(64개)만큼 뽑아짐.
imgs, labels = next(iter(loader))
fig, axes = plt.subplots(nrows=8, ncols=8, figsize=(14, 14))

for ax, img, label in zip(axes.flatten(), imgs, labels):
    ax.imshow(img.reshape(8, 8), cmap='gray')
    ax.set_title(str(label))
    ax.axis('off')

# 학습
epochs = 50

for epoch in range(epochs + 1):
  sum_losses = 0
  sum_accs = 0

  for x_batch, y_batch in loader:
    y_pred = model(x_batch)
    loss = nn.CrossEntropyLoss()(y_pred, y_batch)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    sum_losses += loss

    y_prob = nn.Softmax(1)(y_pred)
    y_pred_index = torch.argmax(y_prob, axis=1)
    acc = (y_batch == y_pred_index).float().sum() / len(y_batch) * 100
    sum_accs += acc

  avg_loss = sum_losses / len(loader)
  avg_acc = sum_accs / len(loader)
  print(f'Epoch: {epoch:4d}/{epochs}, Loss: {avg_loss:.6f}, Accuracy: {avg_acc:.2f}%')

# 10번 테스트 데이터 확인

plt.imshow(x_test[10].reshape((8,8)), cmap='gray')
print(y_test[10])

# 테스트 데이터로 예측값 도출

y_pred = model(x_test)
# 기울기 확인
y_pred[10]

# 예측값에 대한 확률 도출

y_prob = nn.Softmax(1)(y_pred)
y_prob[10]

# 0 ~ 9까지의 확률값을 뽑아내 어떤 숫자로 예측하였는지 보기

for i in range(10):
  print(f'숫자 {i}일 확률: {y_prob[0][i]:.2f}')

# 테스트 정확도

y_pred_index = torch.argmax(y_prob, axis=1)
accuracy = (y_test == y_pred_index).float().sum() / len(y_test) * 100
print(f'테스트 정확도는 {accuracy:.2f}% 입니다.')

'머신러닝 & 딥러닝' 카테고리의 다른 글

18. 비선형 활성화 함수  (0) 2024.06.13
17. 딥러닝  (0) 2024.06.13
15. 파이토치로 구현한 논리회귀  (0) 2024.06.13
14. 파이토치로 구현한 선형회귀  (0) 2024.06.13
13. 파이토치(Pytorch)  (0) 2024.06.13