MNIST 데이터셋에 대하여

2024. 3. 10. 03:52머신러닝&딥러닝/영상처리

728x90

MNIST 손글씨 데이터셋이란?

MNIST는 패턴인식 분야의 지도학습(supervised learining)에 사용되는 손글씨 데이터셋이다. 이는 Yann LeCun, Corinna Cortes, Christopher J.C. Burges에 의해 만들어졌으며, NIST(National Institute of Standards & Technology, 미국 국립표준기술연구소)의 데이터셋을 변형하여 만들어졌다. NIST는 아래 두 데이터셋을 포함한다.

  • SD-1: 미국 고등학생 500명이 작성한 58,527개의 손글씨 숫자
  • SD-3: 미국 인구조사국 직원들이 작성한 손글씨 숫자

기존 NIST에서는 SD-3을 트레이닝 세트로, SD-1을 테스트 세트로 이용하였으나, SD-3이 더 "잘 쓴 글씨" 이므로 인식하기 더 쉽다. 그래서 MNIST는 SD-1을 트레이닝과 테스트 세트 모두에 사용하였다.
 
MNIST의 트레이닝 세트와 테스트 세트는, SD-1의 500명을 250명씩 나누어 넣었으며, 한 세트 당 30,000개의 데이터 수를 유지하기 위해 모자란 수는 SD-3에서 가져와 보충하였다. 이렇게 하여, 총 30,000개씩의 트레이닝 세트와 테스트 세트가 만들어졌다.
 


 

MNIST 데이터 다운로드

MNIST 데이터셋은 Yann LeCun 홈페이지(yann.lecun.com)에서 다운로드 받을 수 있다. 일반적인 인터넷 브라우저에서는 이 도메인에 대한 암호가 걸려 있어 접근하기 어렵다.

 
하지만, torchvision에는 mnist에 접근할 수 있는 모듈이 있다. torchvision.datasets.MNIST에는 아래와 같은 클래스가 정의되어 있다.

class MNIST(
    root: str,
    train: bool = True,
    transform: ((...) -> Any) | None = None,
    target_transform: ((...) -> Any) | None = None,
    download: bool = False
)

 
mnist의 소스 코드는 다음과 같이 pytorch 홈페이지에 나와 있다.  https://pytorch.org/docs/0.2.0/_modules/torchvision/datasets/mnist.html

 

torchvision.datasets.mnist — PyTorch master documentation

Docs » Module code » torchvision » torchvision.datasets.mnist Source code for torchvision.datasets.mnist from __future__ import print_function import torch.utils.data as data from PIL import Image import os import os.path import errno import torch impor

pytorch.org

코드를 읽어 보면, 해당 디렉토리에 데이터가 없으면 새로 다운로드하고, 있으면 다운로드하지 않는다.


MNIST 데이터 구조

 
MNIST 데이터셋은 위와 같이 4가지로 구성된다. train으로 시작하는 것은 트레이닝 세트이다.  t10k로 시작하는 것이 테스트 세트이며, "test 10,000"의 약자이다. 1만 개마다 데이터 포인트가 들어있다. ubyte는 "unsigned byte"의 줄임말이다. Grayscale image의 각 픽셀의 intensity는 0~255의 값을 나타내므로 음수 영역은 필요가 없어 unsigned byte를 사용한다. (C언어에서 unsigned int와 같다)
 
 
또한, 파일 시그니처(file signature, 매직 넘버)의 경우, image file은 0x000803, label file은 0x000801이다.

위는 MNIST t10k labels를 hex viewer로 열어본 결과이다. 가장 앞의 네 자리가 파일 시그니처이며, 16진법이므로 숫자 두개당 1바이트씩에 해당한다.

 

numpy로 MNIST 데이터셋 열기

import numpy as np

def load_mnist_images(filename):
    with open(filename, 'rb') as f:
        # 파일에서 매직 넘버, 이미지 수, 이미지의 높이와 너비를 읽습니다.
        magic, num, rows, cols = np.fromfile(f, dtype=np.dtype('>i4'), count=4)

        # 이미지 데이터를 읽습니다. 데이터는 부호 없는 8비트 정수(ubyte)로 저장됩니다.
        images = np.fromfile(f, dtype=np.uint8)

        # 읽은 데이터를 적절한 형태로 변환합니다. (이미지 수, 높이, 너비)
        images = images.reshape(num, rows, cols)

        return images

 

open함수의 mode를 이진 읽기 모드에 해당하는 "rb"로 설정한다. np.fromfile을 통해 파일에서 magic number, 이미지 수, 이미지 높이와 너비를 불러낼 수 있다. magic number 2051은 4바이트 big endian으로 읽은 값인데, 이는 위에서 언급한 파일 시그니처 0x00000803과 같다.

magic num rows cols
2051 60000 28 28

 

반응형