MNIST

MNIST 데이터셋 완벽 가이드

딥러닝 입문자라면 반드시 알아야 할 손글씨 숫자 데이터셋


MNIST란?

딥러닝(Deep Learning)과 머신러닝(Machine Learning)을 공부하다 보면 가장 먼저 접하게 되는 데이터셋이 바로 MNIST입니다.

MNIST dataset
MNIST dataset

MNIST는 손으로 쓴 숫자 이미지를 모아놓은 데이터셋으로, 이미지 분류(Image Classification) 문제를 처음 학습할 때 가장 널리 사용됩니다.

데이터셋 이름인 MNIST는 다음의 약자입니다.

Modified National Institute of Standards and Technology

원래 미국 국립표준기술연구소(NIST)의 손글씨 데이터셋을 수정 및 정제하여 만들어졌기 때문에 이러한 이름이 붙었습니다.


MNIST가 유명한 이유

MNIST는 딥러닝 역사에서 가장 중요한 데이터셋 중 하나입니다.

많은 연구자들이 새로운 알고리즘이나 신경망 구조를 테스트할 때 MNIST를 사용했으며, 현재도 딥러닝 입문용 데이터셋의 대표 주자로 활용되고 있습니다.

특히 다음과 같은 분야에서 자주 사용됩니다.

  • 인공신경망(ANN)
  • CNN(Convolutional Neural Network)
  • AutoEncoder
  • Variational AutoEncoder(VAE)
  • GAN(Generative Adversarial Network)
  • Transformer 실습

데이터셋 구성

MNIST는 총 70,000장의 이미지로 구성되어 있습니다.

구분개수
학습 데이터(Train)60,000
테스트 데이터(Test)10,000
전체70,000

이미지 특징

MNIST 이미지의 특징은 다음과 같습니다.

항목
크기28 × 28
채널 수1
색상Grayscale
클래스 수10

즉,

28 × 28 × 1

형태의 흑백 이미지입니다.


분류 클래스

MNIST는 숫자 0부터 9까지 총 10개의 클래스로 구성됩니다.

Label숫자
00
11
22
33
44
55
66
77
88
99

모델의 목표는 이미지를 입력받아 어떤 숫자인지 맞추는 것입니다.


실제 데이터 모습

실제로는 28×28 픽셀로 구성되며 각 픽셀은

0 ~ 255

사이의 값을 가집니다.

  • 0 → 검정색
  • 255 → 흰색

PyTorch에서 MNIST 불러오기

PyTorch에서는 torchvision을 이용하여 간단히 다운로드할 수 있습니다.

import torchvision
from torchvision import transforms

transform = transforms.ToTensor()

train_dataset = torchvision.datasets.MNIST(
    root='./data',
    train=True,
    download=True,
    transform=transform
)

test_dataset = torchvision.datasets.MNIST(
    root='./data',
    train=False,
    download=True,
    transform=transform
)

print(len(train_dataset))
print(len(test_dataset))

실행 결과

60000
10000

데이터 확인하기

image, label = train_dataset[0]

print(image.shape)
print(label)

출력 결과

torch.Size([1, 28, 28])
5

여기서

1 = 채널 수
28 = 높이
28 = 너비

를 의미합니다.


이미지 시각화

import matplotlib.pyplot as plt

image, label = train_dataset[0]

plt.imshow(image.squeeze(), cmap='gray')
plt.title(f'Label: {label}')
plt.axis('off')
plt.show()

squeeze()를 사용하는 이유

원본 데이터 형태는

[1, 28, 28]

입니다.

Matplotlib은

[28, 28]

형태를 기대하기 때문에

image.squeeze()

를 사용하여 채널 차원을 제거합니다.


DataLoader 사용하기

from torch.utils.data import DataLoader

train_loader = DataLoader(
    train_dataset,
    batch_size=64,
    shuffle=True
)

images, labels = next(iter(train_loader))

print(images.shape)
print(labels.shape)

출력

torch.Size([64, 1, 28, 28])
torch.Size([64])

CNN 학습 예제

MNIST는 CNN 학습에 가장 많이 사용됩니다.

import torch
from torch import nn

class CNN(nn.Module):

    def __init__(self):
        super().__init__()

        self.conv = nn.Sequential(

            nn.Conv2d(1, 16, 3, padding=1),
            nn.ReLU(),

            nn.MaxPool2d(2),

            nn.Conv2d(16, 32, 3, padding=1),
            nn.ReLU(),

            nn.MaxPool2d(2)
        )

        self.fc = nn.Sequential(
            nn.Linear(32 * 7 * 7, 128),
            nn.ReLU(),
            nn.Linear(128, 10)
        )

    def forward(self, x):

        print("input      :", x.shape)

        x = self.conv(x)
        print("after conv :", x.shape)

        x = x.view(x.size(0), -1)
        print("after view :", x.shape)

        x = self.fc(x)
        print("after fc   :", x.shape)

        return x


net = CNN()

# batch_size=4인 가짜 MNIST 데이터 생성 후 각 단계별로의 출력 사이즈 확인
x = torch.randn(4, 1, 28, 28)

out = net(x)

실행 결과:

input      : torch.Size([4, 1, 28, 28])

after conv : torch.Size([4, 32, 7, 7])

after view : torch.Size([4, 1568])

after fc : torch.Size([4, 10])

왜 CNN이 잘 동작할까?

손글씨 숫자는 다음과 같은 특징을 가지고 있습니다.

  • 선(Line)
  • 곡선(Curve)
  • 모서리(Edge)

CNN은 이러한 특징을 자동으로 추출하는 데 매우 뛰어납니다.

실제로 단순한 CNN만 사용해도 MNIST에서

98~99%

이상의 정확도를 쉽게 달성할 수 있습니다.


AutoEncoder와 VAE에서의 활용

MNIST는 이미지 생성 모델을 공부할 때도 자주 사용됩니다.

대표적인 예는 다음과 같습니다.

AutoEncoder

입력 이미지를 압축한 뒤 다시 복원

28×28
↓
잠재 공간(Latent Space)
↓
28×28

Variational AutoEncoder(VAE)

잠재 공간에서 새로운 숫자를 생성

z
↓
Decoder
↓
새로운 숫자 이미지 생성

GAN

생성자(Generator)가 새로운 숫자를 만들고

판별자(Discriminator)가 진짜인지 가짜인지 판단합니다.


MNIST의 장점

1. 학습 속도가 매우 빠름

이미지가 작아서 CPU만으로도 학습이 가능합니다.


2. 구조가 단순함

복잡한 전처리가 거의 필요 없습니다.


3. 입문용으로 최적

딥러닝의 기본 개념을 이해하기 좋습니다.


MNIST의 한계

MNIST는 교육용으로는 훌륭하지만 실제 문제와는 차이가 있습니다.

데이터가 너무 단순함

숫자만 존재합니다.


이미지 크기가 작음

28×28 픽셀은 현대 컴퓨터 비전 문제에 비해 매우 작은 크기입니다.


이미 높은 정확도

대부분의 최신 모델은 99% 이상의 성능을 기록하기 때문에 모델 간 차이를 비교하기 어렵습니다.


Fashion-MNIST

MNIST의 한계를 보완하기 위해 등장한 데이터셋입니다.

클래스는 숫자가 아닌 의류 이미지입니다.

예시

  • T-shirt
  • Trouser
  • Pullover
  • Dress
  • Coat
  • Sandal
  • Sneaker

등으로 구성됩니다.

입력 크기는 동일하게

28 × 28

입니다.


마무리

MNIST는 딥러닝 입문자가 가장 먼저 접하게 되는 대표적인 데이터셋입니다.

특히

  • ANN
  • CNN
  • AutoEncoder
  • VAE
  • GAN

등을 학습할 때 매우 유용합니다.

이미지 분류와 딥러닝의 기본 원리를 이해하고 싶다면 MNIST로 시작하는 것이 가장 좋은 선택입니다.

이후 CIFAR-10, CIFAR-100, ImageNet과 같은 더 복잡한 데이터셋으로 확장해 나가면 컴퓨터 비전 분야를 체계적으로 학습할 수 있습니다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다