3. 이미지 분류 · 03 batch size
batch size

한 번에 몇 장씩 처리할지, 그리고 이미지를 조금씩 변형해서 늘려보는 방법

무엇을 배울까요?

  • batch size가 “한 번에 묶어서 처리하는 개수”라는 감 잡기
  • 원본 이미지를 먼저 눈으로 확인해서 데이터 감각 익히기
  • ImageDataGenerator로 살짝 변형된 이미지를 배치로 뽑아보기

이해하기 쉬운 예시

  • 사진 15장을 한 장씩 처리하면 너무 느려요. 그래서 보통은 '여러 장을 한 묶음(batch)'으로 묶어서 처리해요. 그리고 사진이 부족하면, 회전/이동/반전 같은 작은 변형을 줘서 데이터가 더 많은 것처럼 만들어 학습을 돕기도 해요.
01

데이터 불러오기 + 0~1로 정리

이 섹션에서 하는 일

여기서는 CIFAR-10 이미지를 불러오고, 숫자 계산이 편하도록 자료형을 바꾼 뒤 0~1 범위로 맞춰요.

코드
import tensorflow.keras.datasets as ds# CIFAR-10 같은 데이터셋을 가져올게요
from tensorflow.keras.preprocessing.image import ImageDataGenerator# 이미지 변형(증식) 도구예요
import matplotlib.pyplot as plt# 그림(이미지)을 보여주려고 써요
(x_train, y_train), (x_test, y_test) = ds.cifar10.load_data()# (이미지,정답)을 학습/테스트로 받아요
x_train = x_train.astype('float32')# 계산하기 좋은 실수형으로 바꿔요
x_train /= 255# 0~255를 0~1로 줄여서 학습을 안정적으로 해요
x_train = x_train[0:15]# 예시로 15장만 먼저 써볼게요
y_train = y_train[0:15]# 정답도 15개만 맞춰서 가져와요
class_names = ['airplane','automobile','bird','cat','deer','dog','flog','horse','ship','truck']
# 숫자→이름표
예상 출력
(출력 없음)
02

원본 이미지 15장 한눈에 보기

이 섹션에서 하는 일

먼저 원본 15장을 그려보면 '지금 우리가 다루는 데이터가 이런 느낌이구나'를 감으로 잡을 수 있어요.

코드
plt.figure(figsize=(20, 2))# 가로로 길게 15장을 보여줄 캔버스
for i in range(15):# 0부터 14까지 반복해요
plt.subplot(1, 15, i + 1)# 1행 15열 중 i번째 칸
plt.imshow(x_train[i])# i번째 이미지를 보여줘요
plt.xticks([]); plt.yticks([])# 눈금은 지워서 깔끔하게
plt.title(class_names[int(y_train[i].item())])# 정답 라벨을 글자로 붙여줘요
plt.show()# 화면에 보여줘요
예상 출력
15장의 이미지가 가로로 쭉 출력됨(아래 이미지 참고)
img
03

batch size + 이미지 증식(generator)

이 섹션에서 하는 일

여기서는 batch_size를 정하고, ImageDataGenerator로 이미지를 조금씩 변형해 '새로운 배치'를 만들어봐요.

코드
batch_size = 4# 한 번에 4장씩 묶어서 만들게요
generator = ImageDataGenerator(rotation_range=20.0, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True)
# 변형 규칙
gen = generator.flow(x_train, y_train, batch_size=batch_size)# (이미지,정답)을 배치 단위로 계속 만들어줘요
for a in range(3):# 배치를 3번 뽑아서 확인해볼게요
img, label = next(gen)# 변형된 이미지 4장 + 라벨 4개가 나와요
plt.figure(figsize=(8, 2.4))# 4장을 보여줄 캔버스
plt.suptitle('Generator trial ' + str(a + 1))# 몇 번째 배치인지 제목으로 표시
for i in range(batch_size):# 4장 반복
plt.subplot(1, batch_size, i + 1)# 1행 4열
plt.imshow(img[i])# 변형된 i번째 이미지
plt.xticks([]); plt.yticks([])# 눈금 제거
plt.title(class_names[int(label[i].item())])# 라벨을 글자로 보여줘요
plt.show()# 배치 한 번을 화면에 보여줘요
예상 출력
배치(4장) 이미지가 3번 출력됨(아래 이미지는 예시)
img

핵심 한 줄