데이터 증강
실습 이미지 불러오기
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open('balloon.webp')
image = np.array(img)
image = np.expand_dims(image, 0)
크기 및 배율 조정하는 모델
import tensorflow as tf
from tensorflow.keras.layers import *
IMG_SIZE = 180
shape = tf.keras.Sequential([
Resizing(IMG_SIZE, IMG_SIZE),
Rescaling(1/255)])
함수처럼 적용 가능
shape_result = shape(image)
plt.imshow(shape_result[0])
<matplotlib.image.AxesImage at 0x1722b097580>
데이터 증강 레이어
모든 factor는 0~1 범위(0%~100%)
RandomContrast(factor)
: 대비(contrast)를 무작위로 조절한다RandomCrop(height, width)
: 이미지를 무작위로 자른다height
와width
는 자를 크기
RandomFlip(mode)
: 이미지를 무작위로 뒤집는다mode="horizontal_and_vertical"
: 수평과 수직으로(기본값)mode="horizontal"
: 수평 방향으로, mode="vertical": 수직 방향으로만
RandomHeight(factor)
: 높이를 무작위로 바꾼다RandomRotation(factor)
: 이미지를 무작위로 회전시킨다RandomTranslation(height_factor, width_factor)
: 이미지를 무작위로 대칭 이동 시킨다RandomWidth(factor)
: 폭을 무작위로 바꾼다RandomZoom(height_factor, width_factor)
: 무작위로 확대한다
증강 모델
aug = tf.keras.Sequential([
RandomFlip(),
RandomRotation(0.2)
])
함수처럼 적용 가능
aug_result = aug(shape_result)
plt.imshow(aug_result[0])
<matplotlib.image.AxesImage at 0x1722a021420>
증강 레이어와 predict
증강 레이어는 함수처럼 사용할 때만 적용됨 predict를 이용하면 적용되지 않음(학습이 끝난 후 예측을 할 때는 적용 X)
same_result = aug.predict(shape_result)
plt.imshow(same_result[0])
1/1 [==============================] - 0s 13ms/step
<matplotlib.image.AxesImage at 0x17224b0d960>
전처리 레이어를 모델에 직접 추가
나머지 레이어와 동기적으로 실행, GPU 가속을 이용 모델을 내보낼 때 함께 저장, 사용시 별도 처리 필요 없음 데이터 증강은 model.fit에서만 작동, 테스트할 때 비활성화
model = tf.keras.Sequential([
shape,
aug,
Dense(1, activation='sigmoid')
])
전처리 레이어로 데이터셋 만들기
나머지 레이어와 비동기적으로 CPU에서 실행 전처리와 증강을 미리해둘 수 있으므로 훈련 속도 향상
preproc = tf.keras.Sequential([shape, aug])
적용
aug_dataset = train_dataset.map(lambda x, y: (preproc(x), y))