Pytorch

[파이토치] MNIST로 이미지 데이터 처리

왕초보코딩러 2024. 12. 31. 15:31
728x90

https://github.com/stonegyoung/Pytorch_Study/blob/master/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B%20%EC%A4%80%EB%B9%84.ipynb

 

Pytorch_Study/이미지 데이터셋 준비.ipynb at master · stonegyoung/Pytorch_Study

Pytorch 공부. Contribute to stonegyoung/Pytorch_Study development by creating an account on GitHub.

github.com

 

파이토치를 사용해 CNN 모델 학습을 위한 이미지 데이터로 만들어보겠습니다.

 

1. 데이터 준비

2. 데이터셋 객체 생성

3. 전처리 (transform 사용)

4. 파이토치가 이미지를 불러올 수 있는 형태로 만들기(DataLoader 사용. 데이터 로더가 배치 단위로 쪼개고, 전처리도 적용)

5. 모델 결정 및 구현

 


MNIST 데이터셋으로 이미지 데이터 처리를 해보겠습니다.

 

필요 라이브러리 임포트

import torch
import numpy as np
import  torch.nn as nn # 신경망 모델 정의
import torch.nn.functional as F # 신경망에서 사용하는 함수
from torch.optim import Adam # 최적화 함수
import torchvision.transforms as transforms # 이미지 전처리 및 변환
from torchvision.datasets import MNIST # 데이터셋
from torch.utils.data import DataLoader # 데이터로더
import matplotlib.pyplot as plt # 시각화

 

데이터 전처리

torchvision의 transforms를 사용하여 이미지 데이터 전처리/증강을 해줍니다.

2024.12.28 - [Pytorch] - [파이토치] 이미지 데이터 전처리/증강

 

[파이토치] 이미지 데이터 전처리/증강

데이터 전처리/증강torchvision의 transforms를 사용이미지 데이터 전처리데이터 다양성을 높이기 위해 증강 https://github.com/stonegyoung/Pytorch_Study/blob/master/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EC%A0%84%EC%B2%98%EB%A6%AC.ipy

dogfoot1.tistory.com

 

import torchvision.transforms as transforms

data_transform = transforms.Compose([
    transforms.ToTensor(), # 텐서로 바꿔라
    transforms.Resize(32), # 32x32 사이즈로 변환
    transforms.Normalize((0.5), (1.0)) # 평균이 0.5고, 표준편차가 1.0인 이미지로 변환
])

 

데이터셋 객체 생성

torchvision.datasets의 MNIST 함수를 사용하여

데이터 다운 + 전처리 적용를 한 번에 한다

from torchvision.datasets import MNIST # 데이터셋

# train, test 이미지 데이터셋 필요
# 불러오면서 이미지 분리도 함, 적용할 전처리도 지정 가능
train_data = MNIST('./', train=True, transform=data_transform, download=True) # 불러올 경로, 사용할 transform, 다운로드 할 건지
test_data = MNIST('./', train=False, transform=data_transform, download=True) # 불러올 경로, 사용할 transform, 다운로드 할 건지

 

데이터 확인

train_data

 

test_data

 

안의 데이터 살펴보기

.data, .targets 사용

train_data.data

 

train_data.targets

 

 

shape 확인

전처리는 적용 안됨

+

이미지 데이터 shape 형식 (batch, channel, height, width)

현재 train_data의 shape (batch, height, width)

흑백이어서 채널이 추가되지 않음

 

채널 추가

차원 변환

.unsqueeze(dim=) 사용

x_train = train_data.data.unsqueeze(dim=1)
x_train.shape

 

 

하나의 이미지 데이터만 확인

# 60000개 중 첫 번째 것
# (channel, h, w)
x_train.data[0].shape

 

 

 

배열이 아닌 이미지로 확인하기

tensor 이미지 한 개 배열: (channel, height, width)

numpy 이미지 한 개 배열: (height, width, channel)

이미지 시각화 시 tensor -> numpy로 바꿔주야 한다

 

1. tensor -> numpy 

.numpy() 사용

2. 차원 변경

.transpose() 사용

 

import matplotlib.pyplot as plt

def imgshow(tensor_array, cmap=None):
  # tensor -> numpy
  numpy_array = tensor_array.numpy()
  # 차원 변환 (channel, h, w) -> (h, w, channel)
  num_img = numpy_array.transpose(1,2,0) # (0, 1, 2) -> (1, 2, 0)
  plt.axis('off') # 눈금 제거
  plt.imshow(num_img, cmap=cmap)

 

정답 데이터 보기

# 답 확인
train_data.targets[0].item() # 5

 

 

파이토치가 이미지를 불러올 수 있는 형태로 만들기(DataLoader)

# 데이터  불러오기
# 한 번에 다 학습시키지 못하니까 배치 단위로 쪼개서 한다: DataLoader
from torch.utils.data import DataLoader

# 32개 이미지씩 한 번에
# 배치를 많이 넣으면 한꺼번에 학습 많이 돼서 속도는 빠르지만 메모리는 많이 먹음 -> 본인 메모리카드가 버틸 수 있을 때까지
train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
test_loader = DataLoader(test_data, batch_size=32)

 

 

DataLoader 안의 데이터 살펴보기

batch size 확인

train_loader.batch_size

 

배치 단위로 하나씩 불러오기

next(iter()) 사용 -> [데이터, 타겟] 으로 되어 있음

# 첫 번째 32개 가져오기 : [데이터, 타겟] 이렇게 되어있음
next(iter(train_loader))

 

# 데이터와 타겟
data, target = next(iter(train_loader))

 

 

전처리 전(train_data)와 전처리 후(train_loader) shape 확인

# 전처리 전, 전처리 후
x_train.data[0].shape, data[0].shape