Skip to main content

이항 분류

PyTorch와 Lightning

  • PyTorch 설치:
    • 홈페이지 참고 https://pytorch.org
    • GPU 지원을 위해서는 별도로 CUDA 및 CuDNN 설치 필요
  • Lightning:
    • PyTorch 프레임워크 위에서 동작하는 경량화된 래퍼 라이브러리
    • 복잡한 연구 코드와 모델 구현을 보다 깔끔하고 일관되게 작성할 수 있도록 도와줌
    • 실험을 쉽게 관리하며, 다양한 하드웨어 환경에서 효율적으로 훈련을 실행할 수 있는 기능을 제공
  • 설치:
    !pip install torch torchvision torchaudio lightning

MNIST

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

데이터 다운로드

from torchvision import datasets, transforms

train_dataset = datasets.MNIST(
root='./data', # 데이터 저장 경로
train=True, # 학습용 데이터셋
download=True, # 데이터가 없으면 다운로드
transform=transforms.ToTensor() # 텐서로 변환
)

배열과 텐서

  • 수학적 개념:
    • 스칼라(scalar) → 0차원 값
    • 벡터(vector) → 1차원 값
    • 행렬(matrix) → 2차원 값
    • 텐서(tensor) → n차원 값
  • 배열(array): 컴퓨터에서 동일한 크기의 원소들로 구성된 데이터 구조
  • 텐서를 배열로 표현할 수 있음
  • Python에서 numpy는 array, pytorch는 tensor라는 표현을 사용

데이터 보기

import numpy as np
from PIL import Image

x, y = train_dataset[0] # 0번 데이터
x = x.squeeze() # 텐서 모양 (1, 28, 28) -> (28, 28)
x = x.numpy() # 텐서 -> 배열
x = x * 255 # 값의 범위 [0, 1] -> [0, 255]
x = x.astype(np.uint8) # 자료형 float -> uint8
Image.fromarray(x) # 이미지 보기

이항 분류와 다항 분류

  • 이항 분류: 둘 중에 하나로 분류하는 것
  • 다항 분류: 셋 이상 중에 하나로 분류하는 것
  • 현재 데이터셋은 10가지로 분류하는 다항 분류 데이터셋
  • 이항 분류를 위해 0과 1만 뽑음
    import torchutils
    binary_train_dataset = torchutils.BinarySubset(train_dataset, 0, 1)
  • 이항 분류를 할 때는 항상 레이블이 0과 1이어야 함
  • BinarySubset으로 3과 4를 뽑으면 3 → 0, 4 → 1로 레이블이 바뀜

모형 정의

import torch
import torch.nn as nn
import torch.nn.functional as F
import pytorch_lightning as pl
from torchmetrics.classification import BinaryAccuracy

class BinaryClassifier(pl.LightningModule):
def __init__(self, input_size=784): # 입력 이미지의 크기: MNIST의 경우 28*28=784
super().__init__()
self.linear = nn.Linear(input_size, 1) # 입력값을 결합하여 한 개의 출력을 만듦
self.accuracy = BinaryAccuracy() # 정확도(맞은 비율) 계산

def forward(self, x): # 모형에 x가 입력되면
x = x.view(-1, 784) # 입력 이미지를 1차원으로 평탄화 (N, 28, 28) → (N, 784)
x = self.linear(x) # x를 linear 레이어에 입력하여 한 개의 출력을 만듦
x = F.sigmoid(x) # 시그모이드 활성화 함수
return x

def training_step(self, batch, batch_idx): # 훈련의 한 단계
images, labels = batch
outputs = self(images).squeeze() # 이미지를 모형에 입력하여 출력을 얻음
loss = F.binary_cross_entropy(outputs, labels.float()) # 손실 계산
self.log('loss', loss) # 손실 기록
accuracy = self.accuracy(outputs, labels) # 정확도 계산
self.log('accuracy', accuracy) # 정확도 기록
return loss

def test_step(self, batch, batch_idx): # 테스트도 훈련과 동일하게
return self.training_step(batch, batch_idx)

def configure_optimizers(self): # 알고리즘 설정
optimizer = torch.optim.Adam(self.parameters(), lr=0.001)
return optimizer

Linear

  • 선형 모형 y = wx + b 형태의 레이어
  • 모든 입력에 대해 가중치 w를 곱하고, 편향 b를 더함
  • Fully Connected라고도 함
  • -∞ ~ +∞ 를 출력
  • 이항 분류 문제이므로 0 또는 1로 출력을 해야 함 → 활성화 함수(activation function)

평탄화

시그모이드 함수 sigmoid function

  • 출력층에서 0~1 사이의 출력을 표현하기 위해 사용
  • S자(sigma)를 닮은(oid)이라는 뜻
  • 계단 함수는 미분불가능하므로 점진적 학습이 어려움
  • 0~1 사이에서 매끄럽게 변하는 함수
  • 출력은 확률로 해석 (예: 0.8 → 1일 확률이 80%)
  • 통계에서는 로지스틱(logistic) 함수라고 부름
σ(z)=11+ez\sigma(z) = \frac{1}{1 + e^{-z}}

퀴즈