파이토치를 사용해 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] - [파이토치] 이미지 데이터 전처리/증강
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
'Pytorch' 카테고리의 다른 글
[파이토치] CNN 모델 학습, 평가, 추론 (0) | 2025.01.06 |
---|---|
[파이토치] CNN Lenet5 구현 (1) | 2025.01.04 |
[파이토치] 이미지 데이터 전처리/증강 (1) | 2024.12.28 |
[파이토치] CNN (0) | 2024.12.26 |
[파이토치] iris 데이터를 위한 신경망 만들어보기 (0) | 2024.12.24 |