부족한 이미지 데이터를 늘리는 방법은? Image Data Augmentation
를 이용한다.
공식문서 참고
https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator
model.fit()
을 수행할 때 validation_split
을 사용했는데 Image Data Augmentation을 사용할 때에는 validation data를 별도로 저장해야 한다.
from keras.preprocessing.image import ImageDataGenerator
#train데이터
trainIDG = ImageDataGenerator(rescale=1./255, # 사실 이 부분은 전처리 과정에서 했다.
zca_whitening=True, # apply ZCA whitening
rotation_range=30, # randomly rotate images in the range (degrees, 0 to 180)
zoom_range = 0.2, # randomly zoom image
width_shift_range=0.1, # randomly shift images horizontally (fraction of total width)
height_shift_range=0.1, # randomly shift images vertically (fraction of total height)
horizontal_flip=True, # randomly flip images
vertical_flip=True) # randomly flip images
# validation 데이터
valIDG = ImageDataGenerator() #아무 옵션도 안주면 기존 이미지 그대로 사용!
생성한 ImageDataGenerator를 여러가지 방법으로 적용할 수 있는데 그 중 이미지 데이터가 어디에 위치해 있냐에 따라서 사용하는 함수가 달라진다.
공식문서 참고 (한글)
https://keras.io/ko/preprocessing/image/
이미 불러온 이미지를 활용할 때
#train 데이터 적용
# 학습이 될 때 실시간으로 이미지를 생성하고 버린다. 사용된 이미지를 저장하려면 주석을 해제하고 실행한다.
flow_trainIDG = trainIDG.flow(train_x, train_y,
batch_size=128,
# save_to_dir='output',
# save_prefix='train',
# save_format='png'
)
trainIDG.fit(train_x) # 옵션에 따라 필요할 수도 있고 그렇지 않을 수 있다.
#validation 데이터 적용
flow_valIDG = valIDG.flow(val_x, val_y)
이미지가 특정 경로(위치)에서 class/카테고리별로 정리된 상태일 때
flow_dir_trainIDG = train_idg.flow_from_directory('분류된 이미지가 저장된 폴더 경로',
save_to_dir='새로 만들어진 이미지가 저장될 경로',
save_prefix='train',
save_format='jpg',
target_size=(28,28),
color_mode='grayscale',
class_mode='categorical'
)
flow_dir_valIDG = val_idg.flow_from_directory('분류된 이미지가 저장된 폴더 경로',
save_to_dir='새로 만들어진 이미지가 저장될 경로',
save_prefix='val',
save_format='jpg',
target_size=(28,28),
color_mode='grayscale',
class_mode='categorical'
)
(모델 생성 부분 생략)
🏉 validation_split 사용 불가
ValueError: validation_split
is only supported for Tensors or NumPy arrays, found following types in the input: [<class 'keras.preprocessing.image.DirectoryIterator'>]
=> 위에서 validation 데이터도 Image Data Generator를 적용한 이유이다! validation_data를 사용하자.
# 모델 학습하기
es = EarlyStopping(monitor='val_loss', # 얼리스토핑 적용 대상
min_delta=0, # 임계값.
patience=3, # 몇 번 더 지켜볼래.
verbose=1,
restore_best_weights=True # 최적의 가중치로 돌려줌.
)
#flow로 만든 이미지
model.fit(flow_trainIDG, # 위에서 설정한 IDG를 사용
validation_data=flow_valIDG, # validation data 역시 IDG를 사용
epochs=10000, verbose=1,
callbacks=[es]
)
#flow_from_directory로 만든 이미지
#model.fit(flow_dir_trainIDG, validation_data=flow_dir_valIDG,
# epochs=100, verbose=1, callbacks=[es])
그러나 원본에서 벗어난 새로운 특징은 만들어 낼수 없다는 한계가 있다.
다음에는 이를 보강하기 위해 이미 학습된 모델을 사용하는 Transfrer Learning
을 공부해보자!