Aivle Til 230314 시각지능 딥러닝 2
title: AIVLE TIL (‘23.03.14) 시각지능 딥러닝 (2) date: 2023-03-14 14:41:11.825 +0000 categories: [에이블스쿨] tags: [] description: CNN 모델링 실습, Data Augmentation image: /assets/posts/2023-03-14-aivle-til-230314-시각지능-딥러닝-2/thumbnail.png
오늘 배운 것
CNN 모델링 실습
Functional, Sequential API를 각각 활용해 Conv2D, MaxPool2D, BatchNormalization, Dropout 등 다양한 레이어를 연결하며 모델링을 진행하였다.
MNIST, Fashion MNIST, CIFAR-10 다중분류 문제를 풀며, 기존 Fully Connected 신경망 대비 이미지 분류 문제에서 CNN 모델의 강력함을 직접 확인하였다.
Data Augmentation
- 지금까지는 학습용으로 제공된 풍부한 양의 이미지 데이터를 사용하였다. 그러나 실무에서는 이미지 데이터를 수집하는 것 자체가 장벽일 가능성이 크다.
- 일반적으로 구할 수 있는 대부분의 이미지는 저작권 이슈 존재
- 비싼 비용을 지불하고 데이터를 구입하거나, 소량의 데이터만을 사용해야 한다.
가지고 있는 데이터를 번형하여 마치 새로운 학습 데이터인 것처럼 간주해, 부족한 학습 데이터를 최대한 늘려보는 것이 바로 Data Augmentation이다.
- Data Augmentation은 학습 데이터가 늘어난 것과 같은 효과가 있을 뿐 아니라, 모델의 학습에 대해 Regularization의 역할을 하여, 학습 성능을 줄이는 대신 일반화 성능을 증가시키는 효과가 있다.
ImageDataGenerator
ImageDataGenerator는 곧 deprecated 될 예정이다. ImageDataGenerator 대신 keras layers 내부에서 이를 처리할 수 있도록 바뀌고 있다. 자세한 것은 공식문서를 참고하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
tf.keras.preprocessing.image.ImageDataGenerator(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
zca_epsilon=1e-06,
rotation_range=0,
width_shift_range=0.0,
height_shift_range=0.0,
brightness_range=None,
shear_range=0.0,
zoom_range=0.0,
channel_shift_range=0.0,
fill_mode='nearest',
cval=0.0,
horizontal_flip=False,
vertical_flip=False,
rescale=None,
preprocessing_function=None,
data_format=None,
validation_split=0.0,
interpolation_order=1,
dtype=None
)
정말 다양한 옵션을 제공하는데 자주 쓰게되는 것으로 배운 옵션 몇가지를 다뤄보자
- zca_whitening : True - 노이즈를 제거하는 연산을 활성화. 연산량이 많기 때문에 학습이 느려짐.
- rotation_range : 이미지의 회전 범위를 지정 0 ~ 360도의 범위 사용
- width_shift_range : 가로로 이미지를 이동하는 범위 지정. 1 미만의 값은 비율, 1 이상의 값은 픽셀 단위로 처리
- height_shift_range : 세로로 이미지를 이동하는 범위를 지정.
- brightness_range : float 두개가 담긴 tuple을 인자로 받으며, 해당 범위 내로 밝기 변경
- shear_range : 이미지를 찌그러트리는 정도
- zoom_range : 이미지 확대/축소 정도
- fill_mode : 변형으로 인해 원본에 없는 여백 공간이 생겼을 때, 이를 채우는 방법
- 일반적으로 ‘nearest’를 사용
- ImageDataGenerator 인스턴스를 만들고, 다음 과정을 진행하면 된다.
1
aug = ImageDataGenerator( ... )
aug.fit
- 원본 데이터를 지정하고 학습하는 과정이다.
1
aug.fit(x_train)
aug.flow
- 증강된 데이터 배치가 담기는 인스턴스를 생성하는 메서드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
flow(
x,
y=None,
batch_size=32,
shuffle=True,
sample_weight=None,
seed=None,
save_to_dir=None,
save_prefix='',
save_format='png',
ignore_class_split=False,
subset=None
)
- x : augmentation을 진행할 이미지
- y : x의 라벨
- batch_size : 한번에 생성할 샘플 수 (학습 시 batch size가 된다)
save_to_dir, save_prefix, save_format : 생성된 이미지를 저장할 때 저장할 경로와 형식 지정
- 학습시 기존 데이터 대신 datagen을 넣으면, 증강된 데이터를 이용한 학습을 진행한다.
1
datagen = aug.flow(x_train, y_train, batch_size=128)
궁금한 점 (앞으로 공부할 것)
- BatchNormalization layer와 Dropout layer는 어느 레이어 사이에 위치하는 것이 모델 성능에 가장 잘 기여할까?
- 이번 실습의 경우 Augemetation을 한 후에 오히려 모델 성능이 대폭 감소하는 모습을 보였다. 이는 왜그런걸까? Augmentation 과정에 실수가 있었나? -> Kaggle, Github 등에서 Augmentation 예제를 공부해보자.