덕배의 블로그
딥러닝 MNIST 알아보고 예제를 파이토치로 실습해보자 본문
반응형
MNIST
MNIST를 알기 전에 로지스틱 회귀를 통해 이진 분류를 해결한다면 소프트맥스 회귀를 통해 다중 클래스 분류가 가능하다. 그렇다면 수많은 데이터를 분류하기 위해서는 다중 클래스 분류를 해야 하기에 우리는 소프트맥스 회귀를 이용한다.
로지스틱 회귀가 무엇인지 소프트맥스 회귀가 무엇인지 궁금하다면 밑에 링크를 통해 알아보자.
로지스틱 회귀, 시그모이드와 비용함수(크로스 엔트로피)에 대해 알고 파이토치로 실습해보자
로지스틱 회귀 이번 글은 로지스틱 회귀와 시그모이드 함수, 교차 엔트로피(크로스 엔트로피)에 대해서 알아보고 파이토치로 간단하게 실습까지 해보려 한다. 예를 들면 어떤 메일을 받았을 때
kdbeom.com
소프트맥스(softmax) 회귀에 대해서 알아보고 파이토치로 실습 해보자
소프트맥스 회귀 소프트 맥스를 알기 전에 2개의 선택지 중에서 1개를 고르는 이진 분류에는 로지스틱 회귀를 통해 알아보았다. 근데 3개 이상의 선택지 중에서 1개를 고르는 다중 클래스 분류에
kdbeom.com
MNIST란?
MNIST는 과거에 우체국에서 편지의 우편 번호를 인식하기 위해서 만들어진 훈련 데이터이며 숫자 0부터 9까지의 이미지로 구성된 손글씨 데이터셋이다.
- 이미지 인식 및 분류와 관련된 기계 학습 알고리즘을 테스트하는 데 적합
- 총 60000개의 훈련 데이터와 레이, 총 10000개의 테스트 데이터와 레이블
- 60000개의 훈련 데이터, 테스트 데이터로 정확도와 성능 측정
- 가장 기본적이면서 대표적인 데이터셋
- 더 복잡한 데이터 셋으로 넘어가기 전에 기본적인 기계 학습 개념 파악
- MNIST는 상대적으로 작고 이해도가 높기 때문에 디버깅과 테스트 목적으로 사용
파이토치 실습
소프트맥스 회귀를 통한 MNIST 데이터 분류
import torch
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
import torch.nn as nn
import matplotlib.pyplot as plt
import random
USE_CUDA = torch.cuda.is_available() # GPU를 사용가능하면 True, 아니라면 False를 리턴
device = torch.device("cuda" if USE_CUDA else "cpu") # GPU 사용 가능하면 사용하고 아니면 CPU 사용
print("다음 기기로 학습합니다:", device)
random.seed(123) #파이썬의 난수 모듈에 의해 수행되는 모든 난수 연산이 재현 가능 보장
torch.manual_seed(123) #CPU 작업에 사용되는 난수 생성기에 대한 난수 시드 설정
if device == 'cuda':
torch.cuda.manual_seed_all(123)
training_epochs = 15
batch_size = 100
mnist_train = dsets.MNIST(root='MNIST_data/',
train=True, #훈련 데이터가 포함
transform=transforms.ToTensor(), #이미지를 pytorch 텐서로 변환
download=True)
mnist_test = dsets.MNIST(root='MNIST_data/',
train=False, #테스트 데이터가 포함
transform=transforms.ToTensor(),
download=True)
data_loader = DataLoader(dataset=mnist_train,
batch_size=batch_size, # 배치 크기는 100 지정, 100개 이미지 처리한 후 모델 업데이트
shuffle=True,
drop_last=True)
linear = nn.Linear(784, 10, bias=True).to(device)
criterion = nn.CrossEntropyLoss().to(device) # 손실함수
optimizer = torch.optim.SGD(linear.parameters(), lr=0.1) #경사하강
for epoch in range(training_epochs): # 앞서 training_epochs의 값은 15로 지정함.
avg_cost = 0
total_batch = len(data_loader)
for X, Y in data_loader:
# 배치 크기가 100이므로 아래의 연산에서 X는 (100, 784)의 텐서가 된다.
X = X.view(-1, 28 * 28).to(device)
# 레이블은 원-핫 인코딩이 된 상태가 아니라 0 ~ 9의 정수.
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')
- Shuffle = True
- DataLoader에서 Shuffle을 True로 설정하면 각 에포크 내의 데이터 샘플 순서가 랜덤화
- 에포크마다 다른 순서로 데이터를 모델에 제시
- 모델이 해당 순서에 고유한 패턴을 학습하여 과적합을 초래
- 모델이 더 잘 일반화되고 다양한 상황에서 패턴을 인식하는 방법을 배울 수 있다.
- drop_last = True
- 모든 배치의 크기가 동일
- 데이터셋 크기가 배치 크기로 완벽하게 분할되지 않으면 지정된 배치 크기보다 작은 크기를 가진 마지막 배치가 삭제됨
- 모든 배치의 크기가 동일하도록 보장하기 위해 설정
- 마지막 배치가 너무 작으면 모델이 매개 변수를 효과적으로 업데이트에 힘이 든다.
이렇게 MNIST가 무엇인지 다중 분류 회귀가 무엇인지 알아보았다.
'인공지능' 카테고리의 다른 글
인공지능 딥러닝에서의 과적합, 과소 적합에 대해서 알아보자 (0) | 2023.08.29 |
---|---|
소프트맥스(softmax) 회귀에 대해서 알아보고 파이토치로 실습 해보자 (0) | 2023.08.21 |
원-핫 인코딩(One-Hot Encoding)에 대해 알아보자 (0) | 2023.08.20 |
OAK-D PoE 카메라에서 yolov8 커스텀 해보기 (0) | 2023.08.19 |
로지스틱 회귀, 시그모이드와 비용함수(크로스 엔트로피)에 대해 알고 파이토치로 실습해보자 (0) | 2023.08.18 |