본문 바로가기
모두의 딥러닝/강의자료 정리

Lab 07-2: MNIST Introduction

by cvlab_김준수 2025. 1. 26.

MNIST란? 

아래의 사진과 같이 0~9까지의 숫자의 손글씨 데이터 셋이다. 데이터는 28x28의 이미지고, 채널은 1개로 회색 이미지이다. 

 

 

 

 

torchvision이란?

다양한 데이터 셋, 아키텍쳐, 트랜스폼을 제공하는 패키지이다. 우리는 이 패키지를 통해서 MNIST 데이터를 가져오고 손글씨의 숫자를 예측하는 모델을 만들어보려고한다. 

 

 

 

Epoch, Batch size, Iteration에 대해 한번에 이해할 수 있는 문장

" 훈련 데이터 1000개를 배치 사이즈 500으로 해서 2번의 Iteration을 거쳐 1epoch로 학습 "

 

즉, Epoch란 훈련 데이터 전체를 한번 돌았을 때를 의미하고, 배치 사이즈는 훈련 데이터 셋을 특정 개수로 그룹화하는 사이즈를 의미하고, Iteration는 배치 사이즈(batch size)만큼 데이터를 처리하는 단위이다.

 

 

import torch
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import random

# 디바이스 설정: CUDA(즉, GPU)가 사용 가능하면 'cuda'로, 그렇지 않으면 'cpu'로 설정
device = 'cuda' if torch.cuda.is_available() else 'cpu'

# 재현성을 위해 시드(seed) 고정
random.seed(777)                # 파이썬의 랜덤 모듈 시드 설정
torch.manual_seed(777)          # PyTorch의 CPU 시드 설정
if device == 'cuda':
    torch.cuda.manual_seed_all(777)  # CUDA가 사용 가능하면 모든 GPU 디바이스의 시드 설정

# parameters 설정
training_epochs = 15
batch_size = 100

# MNIST dataset 가져오기
mnist_train = dsets.MNIST(root='MNIST_data/', # 경로
                          train=True, # 학습 데이터인지 테스트 데이터인지
                          transform=transforms.ToTensor(), # 어떤 트랜스폼을 사용할지(ToTensor는 0~255를 0~1로 변경)
                          download=True) # 데이터를 다운로드할지

mnist_test = dsets.MNIST(root='MNIST_data/',
                         train=False,
                         transform=transforms.ToTensor(),
                         download=True)

# dataset loader
data_loader = torch.utils.data.DataLoader(dataset=mnist_train, # 어떤 데이터를 사용할지
                                          batch_size=batch_size, # 어떤 배치사이즈를 사용할지
                                          shuffle=True, # 무작위로 데이터를 가져올지
                                          drop_last=True) # 배치사이즈에 맞게 설정하고 남는 데이터는 어떻게 할지

                                          
# MNIST data image of shape 28 * 28 = 784
linear = torch.nn.Linear(784, 10, bias=True).to(device) # 모델

# define cost/loss & optimizer
criterion = torch.nn.CrossEntropyLoss().to(device)    # Softmax는 토치의 크로스엔트로피에서 계산이 되므로 생략
optimizer = torch.optim.SGD(linear.parameters(), lr=0.1) # 옵티마이저는 모델의 가중치를 업데이트하는 것

# 학습 시작
for epoch in range(training_epochs):
    avg_cost = 0
    total_batch = len(data_loader)

    for X, Y in data_loader:
        # X는 MNIST 데이터 Y는 Label
        X = X.view(-1, 28 * 28).to(device)
        Y = Y.to(device)

        optimizer.zero_grad()
        hypothesis = linear(X)
        cost = criterion(hypothesis, Y)
        cost.backward()
        optimizer.step()

        avg_cost += cost / total_batch

    print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))

print('Learning finished')