pytorch MNIST

우주먼지·2021년 1월 26일
0

pytorch

목록 보기
3/3

MNIST를 이용하여 MLP설계

MNIST란?

0~9까지 사람의 손글씨 데이터.

즉, pytorch로 MNIST 데이터를 이용하여 숫자 손글씨를 구별하는 모델을 설계한다.

모델을 설계하는 순서는 아래와 같다.

  1. 모듈 임포트하기
  2. 사용할 장비 확인(cuda or cpu)
  3. 데이터 다운로드 후 데이터 확인
  4. 모델 설계
  5. optimizer, objective function 설정
  6. evaluation 함수 정의
  7. 실행 후 결과 확인

1. 모듈 임포트 하기

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import transforms, datasets

2. 사용할 장비 확인

GPU(cuda)를 사용이 가능한지 확인하고 사용이 불가한 상태일 경우 CPU 를 사용하도록 한다.
(torch.is_available()함수로 확인)


내 컴퓨터에서는 cuda(GPU)를 사용하여 모델을 학습했다.

3. 데이터 다운로드 후 데이터 확인

torchvision내의 datasets를 이용하여 데이터를 다운로드했다. 이를 train, test로 나눠서 다운로드 받아서 사용했다.
이미지 데이터로 다운받아지기 때문에 이를 pytorch에서 사용하기 위해서 tensor로 바꿔줬다.(ToTensor()함수 사용)

다운로드한 데이터를 batch-size만큼씩 묶어서 1개의 미니배치를 구성해준다.(DataLoader함수 사용)

test_dataset = datasets.MNIST('../data/MNIST', train = False, transform = transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(dataset = train_dataset, batch_size = BATCH_SIZE, shuffle = True)


다운 받은 데이터를 matplotlib을 이용하여 출력해서 확인해준다.
위에 그림과 같이 라벨링이 잘된 데이터가 다운되었음을 확인할 수 있다.

4. 모델 설계

fully connected layer를 여러겹 쌓은 모델을 생성해주었다. 총 3개의 레이어를 이용하였으며 input크기는 데이터의 하나의 크기인 28 * 28, output크기는 0~9까지인 10으로 지정해주었다.

fully connected layer를 통해서 1차원으로 데이터를 펼쳐준 후, sigmoid를 통해 다음 layer input값으로 만들어준다.

마지막에는 softmax()를 이용해 최종 output값을 계산한다.

5. optimizer, objective function 설정

역전파를 진행할 때 사용할 하이퍼 파라미터들을 설정해준다.
criterion에 output값과 계산될 label값들을 원 핫 인코딩한 값을 저장해준다.

6. evaluation 함수 정의

학습의 진행과정을 모니터링하기 위한 함수이다.
일단 모델의 상태를 평가의 상태로 바꿔준 후, image와 label모두 device 할당한다.

테스트 데이터의 라벨값과 모델의 결과가 같으면 correct의 값을 올려주며 정확도를 측정한다.
여기서 loss값과 accuracy값을 출력하면서 모델의 학습 정도를 보여준다.

7.실행 후 결과 확인

결과

책에 나와있는 대로 하이퍼 파라미터를 설정하여 모델을 학습한 결과

tensor([[1],[2],[8],[4],[5],[6],[7],[8],[9],[0],[1],[2],[3],[4],[5],[6]],device='cuda:0')
tensor([[1],[2],[3],[4],[5],[6],[7],[8],[9],[0],[1],[2],[3],[4],[5],[6]],device='cuda:0')

90%정도의 정확도를 보였다. 손실값의 그래프 또한 감소 형태를 보이고 있다.

하지만 더 높은 정확도를 보고 싶어서 이를 올리기 위해 하이퍼 파라미터를 수정한 결과

tensor([[1],[2],[3],[4],[5],[6],[7],[8],[9],[0],[1],[2],[3],[4],[5],[6]],device='cuda:0')
tensor([[1],[2],[3],[4],[5],[6],[7],[8],[9],[0],[1],[2],[3],[4],[5],[6]],device='cuda:0')

약 96%까지 올릴 수 있었다.

파이썬딥러닝파이토치 책을 통해 공부한 내용입니다.

profile
안녕하세요 ㅎㅎ

0개의 댓글