데이터 증식(augmentation)
- 의미 : 원본 이미지에 인위적인 변화를 주어 학습 데이터의 양을 늘린다, 과대적합 방지
- 증식의 방법
- 회전(rotation)
- 이동(shift),
- 밀림(shearing)
- 확대/축소(zoom)
- 상하좌우 반전(flip) 등
데이터 증식 - 회전(rotation)
- 일반적으로 20도나 30도 범위에서 이미지를 회전
![]()
데이터 증식 - 이동(shift)
- 이미지를 수평 또는 수직으로 평행 이동
![]()
데이터 증식 - 확대/축소(zoom)
- 일반적으로 10% ~ 30% 범위에서 이미지를 확대하거나 축소
![]()
데이터 증식 - 밀림(shear)
- 이미지를 강제로 찌그러뜨림
![]()
데이터 증식 - 반전(flip)
- 이미지를 상하 또는 좌우로 90도 회전 시키기
tensorflow.keras에서 제공하는 데이터 증식과 관련된 유용한 함수들
- ImageDataGenerator() : 하이퍼파라미터 설정을 통해서 데이터 증식 방식에 대해서 설정
- train_datagen = ImageDataGenerator(하이퍼파라미터)
- val_datagen = ImageDataGenerator(rescale=1./255) → 데이터 증식(x)
- flow_from_directory() : ImageDataGenerator() 함수에 데이터 공급
- train_generator = train_datagen.flow_from_directory(path, target_size , batch_size, class_mode)
- fit() : 학습 진행
- model.fit(train_generator, epochs, validation_data, callbacks)
tensorflow.keras.callbacks
- 딥러닝 학습 시 종료 조건이나 모델 저장 조건 등을 사용자가 원하는 대로 설정할 수 있도록 클래스와 매서드를 제공하는 모듈
- EarlyStopping 클래스
- 학습의 상태를 더 이상 개선시키지 못할 경우 학습을 강제로 종료 시킬 수 있는 기능을 제공
- 사용방법
- early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss’, verbose=1, patience=5)
- 매개 변수
- monitor : 학습 상태 판단의 기준, 예) ‘val_loss’을 입력할 경우, val_loss가 더 이상 감소하지 않을 경우에 작동
- verbose : 학습의 진행 사항 표시 여부 결정, 학습의 진행 사항을 표시할 경우 verbose=1
- patience : 학습 상태가 개선 되지 않을 경우 참아주는 횟수
- ModelCheckpoint 클래스
- 학습된 모델을 저장할 때 저장 조건을 사용자가 원하는 대로 설정할 수 있는 기능 제공
- 사용방법
- checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath=file_path, monitor=‘val_loss’, verbose=1, save_best_only=True)
- 매개 변수
- file_path : 모델 저장 경로
- monitor : 모델을 저장할 때의 기준
- save_best_only : True 인 경우, monitor 되고 있는 값을 기준으로 가장 좋은 값으로 모델이 저장. False인 경우, 매 epoch마다 모델 저장 (model0, model1, model2....)
# 재구성 모델 정의 하기
# 출력 unit 설정
units = 2
# 모델 생성
model2 = tf.keras.Sequential()
model2.add(base_model)
model2.add(tf.keras.layers.Flatten())
model2.add(tf.keras.layers.Dense(units=256, activation='relu'))
model2.add(tf.keras.layers.Dense(units, activation='softmax'))
# 추가사항
model2.build(input_shape=(None, 224, 224, 3))
# 모델 구조 확인
model2.summary()
# optimizer 재설정
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
# 모델 컴파일
model2.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
# imageDataGenerator() 함수 > 데이터 증식 조건 설정
# 학습용 이미지 증식 조건 설정
train_datagen2 = tf.keras.preprocessing.image.ImageDataGenerator(
rescale=1/255,
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=True
)
# 검증용 이미지 생성 조건설정 > 데이터 증식(X) + scaling(Normalization) 적용
val_datagen2 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
test_datagen2 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
# ImageDataGenerator() 함수와 flow_from_directory() 함수를 사용, 입력 데이터 생성
# 학습용 데이터 생성
train_generator2 = train_datagen2.flow_from_directory(directory=train_path,
batch_size=60,
target_size=(224,224),
class_mode='categorical')
# 검증용 데이터 생성
val_generator2 = val_datagen2.flow_from_directory(directory=val_path,
batch_size=60,
target_size=(224,224),
class_mode='categorical')
# 평가용 데이터 생성
test_generator2 = test_datagen2.flow_from_directory(directory=test_path,
batch_size=10,
target_size=(224,224),
class_mode='categorical')
# 생성되는 데이터와 정답 레이블 확인
# 결과물 생성
images, labels = next(train_generator2)
# 생성된 이미지 배열 모양 확인
print(images.shape)
print('-'*80)
# 정답 레이블 확인
print(labels)
# 조기 종료 설정
early_stop = tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=3
)
# 학습 진행
model2.fit(train_generator2,
epochs=100,
callbacks=[early_stop],
validation_data=val_generator2)
# model.evaluate() 함수 사용
score = model2.evaluate(test_generator2)
# 결과 확인
print(f'평가용 데이터에 대한 평균 loss : {score[0]}')
print('-'*80)
print(f'평가용 데이터에 대한 평균 accuracy : {score[1]}')
참고 자료