logo

이항 분류

PyTorch와 Keras

PyTorch 설치:

  • 홈페이지 참고 https://pytorch.org
  • 처음부터 PyTorch로 개발을 하는 것은 어려우므로 Keras를 함께 사용

설치:

!pip install torch torchvision torchaudio keras

임포트:

import os
os.environ["KERAS_BACKEND"] = "torch"
import keras

MNIST

  • 1998년 미국 국립표준기술연구소 National Institute of Standards and Technology에서 개발한 숫자 자료를 수정한 것(Modified).
  • 가로 28 × 세로 28 크기의 손으로 쓴 숫자(0~9) 흑백 이미지
  • 6만개의 훈련용 이미지와 1만개의 테스트용 이미지로 구성
  • 가장 유명한 컴퓨터 비전 연구용 데이터

MNIST 손글씨 숫자 예시

데이터 다운로드

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

(
    x_train.shape,
    y_train.shape,
    x_test.shape,
    y_test.shape,
)
실행 결과
((60000, 28, 28), (60000,), (10000, 28, 28), (10000,))
  • x_train: 훈련용 이미지
  • y_train: 훈련용 이미지의 클래스(0, 1, 2, …, 9)
  • x_test: 테스트용 이미지
  • y_test: 테스트용 이미지의 클래스 (0, 1, 2, …, 9)

데이터 보기

데이터 크기 보기 (가로 28, 세로 28)

x_train[0].shape  # 이미지 한 장의 형태
실행 결과
(28, 28)

이미지로 보기

from PIL import Image
Image.fromarray(x_train[0])

MNIST 이미지 한 장

클래스 보기

y_train[0]  # 첫 이미지의 클래스
실행 결과
np.uint8(5)

이항 분류와 다항 분류

  • 다항 분류: 셋 이상 중에 하나로 분류하는 것(MNIST는 10가지로 분류하는 다항 분류 데이터셋)
  • 이항 분류: 둘 중에 하나로 분류하는 것
    • 이항 분류를 위해 0과 1만 뽑음
import numpy as np

def filter_binary(x, y, neg_cls, pos_cls):
    cond = (y == neg_cls) | (y == pos_cls)
    x_bin = x[cond]
    y_bin = np.where(y[cond] == neg_cls, 0, 1)
    return x_bin, y_bin

x_train_binary, y_train_binary = filter_binary(
    x_train, y_train, 0, 1  # 숫자 0은 음성, 숫자 1은 양성 클래스
)

(
    x_train_binary.shape,
    y_train_binary.shape,
    y_train_binary[:5],
)
실행 결과
((12665, 28, 28), (12665,), array([0, 1, 1, 1, 1]))
  • 위 함수는 레이블이 0과 1로 바꿈
    • 3과 4를 뽑으면 3 → 0, 4 → 1로
  • 숫자 0과 1만 남긴 훈련 이미지는 12,665장
Previous
딥러닝 프레임워크