Tensorflow

Tensorflow 케라스 EfficientNet Finetuning 예제 - 1

카카오그래놀라 2020. 10. 28. 10:59

Image classification via fine-tuning with EfficientNet

EfficientNet

Author: Yixing_Fu
Date created: 2020/06/30
Last modified: 2020/07/16
Description: imagenet으로 pretrained된 EfficientNet의 Weights를 활용한 Stanford Dogs Classification

- Keras

- Colab

- Github

 

Introduction: what is EfficientNet

 2019년 [Tan_and_Le]에 의해 처음 소개된 EfficientNet은 imagenet 분류와 전이학습을 통한 보통의 이미지 분류 모두에서 가장 높은 정확도에 도달한 효율적인 모델입니다. (i.e. requiring least FLOPS for inference)

EfficientNet, first introduced in [Tan_and_Le,_2019] is among the most efficient models (i.e. requiring least FLOPS for inference) that reaches State-of-the-Art accuracy on both imagenet and common image classification transfer learning tasks.

 

 가장 작은 기본 모델은 상당히 작은 모델이자 최신 모델인 [MnasNet]과 유사합니다. 모델을 확장하는 휴리스틱 방식을 도입함으로써 EfficientNet은 다양한 규모에서 효율성과 정확성의 좋은 조합을 나타내는 모델 제품군 (B0 ~ B7)을 제공합니다. 이러한 스케일링 휴리스틱 (복합 스케일링, 세부 사항은 [Tan and Le, 2019] 참조)을 통해 효율성 지향 기본 모델 (B0)이 모든 스케일에서 모델을 능가하는 동시에 하이퍼 파라미터의 광범위한 그리드 검색을 피할 수 있습니다.

The smallest base model is similar to [MnasNet], which reached near-SOTA with a significantly smaller model. By introducing a heuristic way to scale the model, EfficientNet provides a family of models (B0 to B7) that represents a good combination of efficiency and accuracy on a variety of scales. Such a scaling heuristics (compound-scaling, details see [Tan_and_Le,_2019]) allows the efficiency-oriented base model (B0) to surpass models at every scale, while avoiding extensive grid-search of hyperparameters.

 

 

 모델에 대한 최신 업데이트 요약은 [여기]에서 확인할 수 있습니다. 여기에서 모델의 이미지 넷 성능을 더욱 향상시키기 위해 다양한 증강 체계와 준지도 학습 방식이 적용됩니다. 모델의 이러한 확장은 모델 아키텍처를 변경하지 않고 가중치를 업데이트하여 사용할 수 있습니다.

 A summary of the latest updates on the model is available at [here], where various augmentation schemes and semi-supervised learning approaches are applied to further improve the imagenet performance of the models. These extensions of the model can be used by updating weights without changing model architecture.

B0 to B7 variants of EfficientNet

(이 섹션에서는 "compound scaling"에 대해 소개합니다. 모델에만 관심있다면 이 섹션은 Skip해도 됩니다.)

논문을 볼 때, 사람들은 여러 개의 EfficientNet (B0 ~ B7)를 보며, 임의로 선택된 scaling 계수에 의해 만들어진 연속적인 하나의 모델 그룹으로 생각하기 쉽습니다. 하지만 각각의 모델들은 해상도, 깊이, 너비 등 많은 요소에 영향받습니다.

(This section provides some details on "compound scaling", and can be skipped if you're only interested in using the models)

 Based on the [original_paper] people may have the impression that EfficientNet is a continuous family of models created by arbitrarily choosing scaling factor in as Eq.(3) of the paper. However, choice of resolution, depth and width are also restricted by many factors:

 

- Resolution(해상도): 8, 16 등 으로 나눌 수 없는 해상도는 boundaries근처에서 zero-padding을 야기합니다. 이는 계산 리소스를 낭비하게 됩니다. 이것은 특히 모델의 더 작은 변형에 적용되므로 B0 및 B1의 입력 해상도는 224 및 240으로 선택됩니다.

 

- Depth and width: EfficientNet의 빌딩 블록은 채널 크기가 8의 배수여야합니다.

 

- Resource limit: 메모리 제한은 깊이와 너비가 계속 증가 할 수있는 경우 병목 현상을 해결할 수 있습니다. 이러한 상황에서 깊이 및 / 또는 너비를 늘리고 해상도를 유지하면 성능이 향상 될 수 있습니다.

 

- Resolutions not divisible by 8, 16, etc. cause zero-padding near boundaries of some layers which wastes computational resources. This especially applies to smaller variants of the model, hence the input resolution for B0 and B1 are chosen as 224 and 240.

- The building blocks of EfficientNet demands channel size to be multiples of 8.

- Memory limitation may bottleneck resolution when depth and width can still increase. In such a situation, increasing depth and/or width but keep resolution can still improve performance.

Keras implementation of EfficientNet

 TF2.3 이후 EfficientNet B0~B7의 구현은  tf.keras와 함께 제공됩니다. EfficientNetB0을 사용하여 imagenet에서 1000 개의 이미지 클래스를 분류하려면 다음을 실행합니다:

 

from tensorflow.keras.applications import EfficientNetB0
model = EfficientNetB0(weights='imagenet')

이 모델은 (224, 224, 3) shape의 이미지를 취하며 입력 데이터의 범위는 [0, 255]여야합니다. Normalization은 모델에 포함되어 있습니다.

 

ImageNet에서 EfficientNet을 교육하려면 모델 아키텍처 자체의 일부가 아닌 엄청난 양의 리소스와 여러 기술이 필요하기 때문에 Keras에서 EfficientNet 구현은 기본적으로 AutoAugment을 통한 training을 바탕으로 얻어진 pretrained weights 로드를 통해 이뤄집니다.

 

EfficientNet B0~B7 모델들의 input shape는 각각 다릅니다. 아래 표를 참조하세요:

model input shape
B0 224
B1 240
B2 260
B3 300
B4 380
B5 456
B6 528
B7 600

 

모델을 전이학습에 사용하려면, 모델 옵션에서 include_top 옵션을 False로 하세요:

model = EfficientNetB0(include_top=False, weights='imagenet')

 이 옵션은 두 번째 레이어의 1280 개 피처를 1000 개의 ImageNet 클래스 예측으로 바꾸는 최종 Dense Layer를 제외하게 합니다. top layer(직관적으로는 input layer로 보이나, output layer 입니다.)를 사용자 정의 layers로 바꾼다면, transfer learning workflow안에서 EfficientNet을 feature extractor로 사용할 수 있습니다.

This option excludes the final Dense layer that turns 1280 features on the penultimate layer into prediction of the 1000 ImageNet classes. Replacing the top layer with custom layers allows using EfficientNet as a feature extractor in a transfer learning workflow.

 

 주목할만한 또다른 인자는 stochastic_depth를 담당하는 dropout 비율을 결정하는 drop_connect_rate입니다. 이 매개 변수는 미세 조정에서 추가 정규화를 위한 토글 역할을 하지만 로드된 가중치에는 영향을주지 않습니다. 예를 들어 더 강력한 정규화가 필요한 경우 다음을 시도하십시오.

Another argument in the model constructor worth noticing is drop_connect_rate which controls the dropout rate responsible for stochastic_depth. This parameter serves as a toggle for extra regularization in finetuning, but does not affect loaded weights. For example, when stronger regularization is desired, try:

model = EfficientNetB0(weights='imagenet', drop_connect_rate=0.4)

기본값은 0.2 입니다.

The default value is 0.2.

 

Stanford Dogs 데이터셋에서의 EfficientNetB0 적용

이하 내용은 다음 포스팅에서 다루겠습니다!