EfficientNet이란?
ImageNet 및 common image classification transfer learning tasks에서 FLOPS*의 필요량을 줄인 모델.
(*FLOPS : 부동 소수점 연산 당 비트 연산)
smallest base model의 구조는 MnasNet과 유사하지만 그 크기가 더 작다.
모델을 스케일링하는 휴리스틱방법으로는 다양한 스케일에서 효율성과 정확성의 좋은 조합을 만들어 이를 모델군(B0 to B7)을 제공하는 방식을 사용하였다. 이러한 방식을 통하여, 효율 중심의 기본 모델 B0가 하이퍼파라미터의 포괄적인 그리드 탐색을 피할 수 있도록 구성되었다.
EfficientNet의 B0~B7
EfficientNet 논문 원본의 Eq.(3)부분을 보면, EfficientNet이 임의로 선택된 스케일링 요소로 인해 생성된 continuous family of models 라고 생각할 것이다.
그러나 실제로는 아래의 설명과 같이 해상도, 깊이 및 너비의 선택에 있어서 여러 요소에 제약을 받는다.
- 해상도 선택에서의 제약 : 8, 16 등으로 나누어 떨어지지 않는 해상도는 일부 계층의 경계 부근에서 zero-padding을 발생시키며, 이는 계산 자원을 낭비하게 되는 결과로 이어진다. 이는 특히 모델의 작은 변형들에 적용되며, B0와 B1의 입력 해상도를 각각 224와 240으로 설정되어 있다.
- 깊이 및 너비 : EfficientNet의 구성 요소는 채널의 크기가 8의 배수로 되어 있어야 한다.
- 자원 제한 : 제한된 메모리의 양으로 인하여, 성능을 올리기 위해 깊이 및 너비가 아직 증가할 수 있음에도, 해상도에 병목 현상이 발생한다. 이에 따라 해상도를 유지하고, 깊이 및 너비를 증가시키는 방식으로 성능을 향상시켜야 한다.
결과적으로 EfficientNet 모델의 개발 과정에서는 변형에 따른 깊이 및 너비, 해상도는 사용자에 의하여 수동으로 선택되며, 이러한 선택이 compound scaling formula 에서 크게 벗어날 가능성이 있음에도 좋은 결과가 도출된다는 것이 입증된 상황이다. 그렇기에 이렇게 입증된 B0~B7의 8가지 변형을 사용하는 keras의 구현에는 B0부터 B7, 즉 너비, 깊이, 해상도 파라미터들의 임의 선택을 기용하는 대신 사용자가 직접 모델의 깊이와 너비, 해상도를 마음대로 설정할 수 없도록 하였다.
정리하자면, EfficientNet 모델의 연구 과정에서는 깊이, 너비, 해상도를 수동 선택하여 파라미터를 조정하였지만 keras 에서는 이를 사용할 때 연구를 통해 입증된 B0부터 B7까지의 파라미터를 선택하는 식으로 사용해야 한다는 것이다.
Keras implementation of EfficientNet
Keras v2.3부터 EfficientNet B0 to B7이 구현되어 있으므로 이를 사용하기 위해선 keras의 버전을 체크해야 한다.
기본적으로 EfficientNet을 사용하는 법을 보이기 위해, 간단한 예로 ImageNet으로부터 1000개의 이미지 클래스를 가져오고, 이를 분류하기 위해 EfficientNetB0를 사용하는 상황에서 keras측이 예제로 제공한 작성해야 할 코드를 보이면 아래와 같다.
from tensorflow.keras.application import EfficientNetB0
model = EfficientNetB0(weights='imagenet')
이 모델은 (224, 224, 3) 의 input image를 받고, [0, 255] 범위 내의 input data를 가진다. 참고로, 정규화는 이미 모델의 일부로 포함되어 있다.<
만약 이 코드로 임포트 되지 않는 경우, 아래처럼 import해보면 될 것이다.
from efficientnet.keras import EfficientNetB0
model = EfficientNetB0(weights='imagenet' )
EfficientNet을 ImageNet에서 학습시키는 것은 엄청난 양의 자원을 필요로 하고, model architecture 자체의 일부가 아닌 여러가지 기법을 필요로 하기 때문에, keras 구현에서는 기본적으로 이미 AutoAugment를 사용하여 훈련시킨 사전 훈련 weights를 로드하여 사용한다.
더하여, B0 to B7 베이스 모델들은 각각 input shape이 다르기 때문에, 아래의 표를 참고하여 어떤 모델에 어떤 shape이 요구되는지 파악하는 것을 권장한다.
Base Model | Resolution |
EfficientNetB0 | 224 |
EfficientNetB1 | 240 |
EfficientNetB2 | 260 |
EfficientNetB3 | 300 |
EfficientNetB4 | 380 |
EfficientNetB5 | 456 |
EfficientNetB6 | 528 |
EfficientNetB7 | 600 |
전이 학습을 위하여 모델을 사용할 때, Keras implementation이 아래와 같이 top layers를 제거하는 옵션을 제공한다.
model = EfficientNetB0(include_top=False, weights='imagenet')
미리 훈련된 모델의 마지막 계층(top layers)은 특정 문제에 대한 분류를 담당하는 부분인데, 이를 제거함으로써 새로운 문제에 맞는 출력 계층을 추가할 수 있게 된다.
이렇게 하면 미리 훈련된 모델의 학습된 특징들인 B0 부터 B7을 활용하여 새로운 problem을 보다 효과적으로 해결할 수 있다.
EfficientNet모델을 커스텀화하기 위하여 이 옵션을 자세히 보면, 마지막에 위치한 1280개의 feature들을 1000개의 ImageNet 클래스로 예측하는 Dense 계층을 제외시키는 기능을 갖는다. 이렇게 상위 계층을 사용자 정의 계층으로 교체함으로써, EfficientNet을 전이 학습 작업 흐름에서 feature extractor로 사용할 수 있게 된다.
model constructor에서 주목할 만한 또 다른 argument는 stochastic depth*를 담당하는 dropout 비율을 제어하는 drop_connect_rate 파라미터이다.
(*strochastic depth : 학습 과정에서 무작위로 일부 뉴런을 비활성화시키는 것. 이를 통해 과적합을 방지하고, 일반화 성능을 향상시킨다.)
이 파라미터는 파인 튜닝 과정에서 추가적인 정규화를 위한 토글 역할을 하지만, 이미 로드되어 있는 가중치에는 그 영향을 끼치지 않는 특징을 가진다.
따라서 더 강한 정규화가 필요한 경우, 아래와 같은 코드를 사용하여 drop_connect_rate 값을 높이는 시도를 해 볼 수 있다.
model = EfficientNetB0(weights='imagenet', drop_connect_rate=0.4) #default value = 0.2
다음 포스팅 부터는 본격적인 Dog vs Cat 예제를 다루기 전,
EfficientNet의 논문 리뷰를 먼저 해보며
그 구조를 분석하는 내용을 다루겠다.
'모각코' 카테고리의 다른 글
모각코 3회차 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks Review - Abstract, Introduction, Related Work (0) | 2024.01.27 |
---|---|
모각코 2회차 "EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks" Paper Review - 선행 연구 리뷰 (2) | 2024.01.21 |
24.1.21 모각코 2회 목표 (0) | 2024.01.21 |
24.01.20 모각코 1회차 목표 (0) | 2024.01.20 |
모각코 목표 및 프리뷰 (0) | 2024.01.03 |