[Tensorflow] ImageDataGenerator

Junmo KIM·2021년 1월 16일
2

tensorflow

목록 보기
1/2

ImageDataGenerator 기본

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator


TR_DIR = "/tmp/cats-v-dogs/training/"
tr_datagen = ImageDataGenerator(rescale = 1.0/255.)
tr_generator = tr_datagen.flow_from_directory(TR_DIR,
                                             batch_size=100,
                                             class_mode='binary',
                                             target_size=(150, 150))

VAL_DIR = "/tmp/cats-v-dogs/testing/"
val_datagen = ImageDataGenerator(rescale= 1.0/255.)
val_generator = val_datagen.flow_from_directory(VAL_DIR,
                                               batch_size=100,
                                               class_mode='binary',
                                               target_size=(150,150))


TR_DIR / VAL_DIR 은 각각 trianing과 testing을 위한 데이터가 저장된 경로이다. 해당 경로에는 강아지와 고양이의 사진이 서로 다른 폴더에 저장되어 있다.

ImageDataGenerator의 인자로 rescale을 넣어주었는데, 이는 데이터 픽셀의 범위를 0과 1사이로 scaling하기 위한 인자이다.

이후 "flow_from_directory" 함수에 학습 데이터의 경로, batch 크기, class mode (여기서는 강아지와 고양이 분류 문제라서 이진으로 옵션을 선택하였다), 그리고 데이터 크기 (이미지 크기 = (150, 150))를 인자로 넣어준다.

이후 validation 데이터 역시 같은 작업을 해준다.

history = model.fit(tr_generator, epochs=2, verbose=1, validation_data = val_generator)

이후 사전에 구현한 model의 fit함수를 통해 앞서 선언한 학습용 generator와 검증용 generator를 넣어준다.

tr_generator : 학습용 generator
epochs : 반복 학습량 (자유 선택)
verbose : 학습 진행 정보 출력 (0은 미출력, 1은 진행바만, 2는 epoch당 정보를 출력한다고 한다)
validation_data : 검증을 위한 generator


Data augmentation


TRAINING_DIR = "/tmp/cats-v-dogs/training/"
train_datagen = ImageDataGenerator(rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')
train_generator = train_datagen.flow_from_directory(TRAINING_DIR,
                                                    batch_size=100,
                                                    class_mode='binary',
                                                    target_size=(150, 150))

VALIDATION_DIR = "/tmp/cats-v-dogs/testing/"
validation_datagen = ImageDataGenerator(rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')
validation_generator = validation_datagen.flow_from_directory(VALIDATION_DIR,
                                                              batch_size=100,
                                                              class_mode='binary',
                                                              target_size=(150, 150))

이번에는 단순히 ImageDataGenerator를 불러오는 것 뿐만 아니라 data augmentation도 진행해보자.
Augmentation은 데이터에 조금씩 변형(rotation, shift..)을 주어 가지고 있는 데이터의 양을 불리는 작업이다. 가지고 있는 데이터의 양이 적을 때 사용하게 된다.

우선 처음 선언과 달리 ImageDataGenerator에 들어가는 인자의 수가 증가하였다.

rotation_range : 랜덤하게 회전할 각도의 범위
width_shift & height_shift : 좌우 & 상하 랜덤 이동 범위 (원본 이미지에 대한 비율)
shear_range : shearing transformation 범위 (회전하면서 늘어지는거 같은데 잘 모르겠다)
zoom_range : 랜덤 확대 범위
horizontal_flip : 수평 전환 설정 (50%확률로 뒤집는다. 뒤집어도 자연스러운 케이스에 사용하면 좋다고 함)
fill_mode : 빈 공간을 채우는 방식

위 설정을 통해 기존의 데이터에 랜덤한 변화를 주어서 데이터의 수를 증가시켜 학습하게 된다.

공부하면서 궁금했던게 augmentation을 했을 때 데이터가 얼마나 증가되는가 였는데 찾아보니

매 epoch마다 랜덤한 변화를 준다는 것 같다. 즉 매 epoch마다 학습하는 데이터 수는 가지고 있는 데이터 수와 동일하지만 데이터가 매번 달라지는 것 같다. (링크)
학습 시 데이터를 늘리기 위해서는 fit_generator의 인자 steps_per_epoch를 조절하면 된다. (not sure)

글을 쓰면서 다시 의문이 들었다. fitfit_generator의 차이는 무엇일까? 역시 stackoverflow에 나와있다. 향후 업데이트에서 fit_generatorfit으로 통합된다고 한다.

profile
Integrated M.S.-Ph.D. (Korea Univ.)

2개의 댓글

comment-user-thumbnail
2021년 1월 16일

와! 최고의 게시물!

1개의 답글