AIVLE TIL ('23.03.14) 시각지능 딥러닝 (2)

cjkangme·2023년 3월 14일
0

에이블스쿨

목록 보기
34/81
post-thumbnail
post-custom-banner

오늘 배운 것

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 내부에서 이를 처리할 수 있도록 바뀌고 있다. 자세한 것은 공식문서를 참고하자.

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 인스턴스를 만들고, 다음 과정을 진행하면 된다.
aug = ImageDataGenerator( ... )

aug.fit

  • 원본 데이터를 지정하고 학습하는 과정이다.
aug.fit(x_train)

aug.flow

  • 증강된 데이터 배치가 담기는 인스턴스를 생성하는 메서드이다.
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을 넣으면, 증강된 데이터를 이용한 학습을 진행한다.
datagen = aug.flow(x_train, y_train, batch_size=128)

궁금한 점 (앞으로 공부할 것)

  1. BatchNormalization layer와 Dropout layer는 어느 레이어 사이에 위치하는 것이 모델 성능에 가장 잘 기여할까?
  1. 이번 실습의 경우 Augemetation을 한 후에 오히려 모델 성능이 대폭 감소하는 모습을 보였다. 이는 왜그런걸까? Augmentation 과정에 실수가 있었나?
    -> Kaggle, Github 등에서 Augmentation 예제를 공부해보자.
post-custom-banner

0개의 댓글