본문 바로가기
컴퓨터비전/CNN

[딥러닝] EfficientNet 모델의 개요 및 특징

by PIAI 2022. 3. 20.

개요

 

네트워크의 깊이(Depth), 필터 수(Width), 이미지 Resolution 크기를 최적으로 조합하여 모델 성능 극대화하는 것입니다.

기존에는 이 세 가지를 수동으로 조절하였지만, compound scaling방법을 연구합니다. 깊이, 필터 수, 이미지 크기가 일정한 관계가 있다는 것을 알아내고, 이 관계를 수식으로 만듭니다.

 

위의 그림을 보면, 상대적으로 타 모델 대비 높은 정확도와 적은 파라미터, 연산 수를 나타냅니다.

 

필터 수, 깊이, 이미지 크기

필터 수, 깊이를 일정 수준 이상 늘려도 성능 향상은 미비하지만, 이미지 크기는 어느 정도 약간씩 성능 향상이 지속되고 있습니다. 이미지 해상도가 높을 경우 더 큰 Receptive field가 더 많은 픽셀을 포함하는 비슷한 피처들을 잘 캡처할 수 있습니다. 그리고 더 많은 이미지들을 추상화시킬 수 있습니다.

 

위는 depth와 resolution만 조절한 그래프입니다. 확실히 높일수록 더 좋은 성능을 가집니다. 이제 최적의 Scaling 도출 식을 보겠습니다.

 

Compound Scaling

 

 

 

 

 

구조

MnasNet과 동일한 search space를 사용한 구조입니다. 아래는 모델마다 적정 크기입니다. 웬만하면 맞춰주시는 게 좋습니다.

https://github.com/qubvel/efficientnet/blob/master/efficientnet/model.py 

 

GitHub - qubvel/efficientnet: Implementation of EfficientNet model. Keras and TensorFlow Keras.

Implementation of EfficientNet model. Keras and TensorFlow Keras. - GitHub - qubvel/efficientnet: Implementation of EfficientNet model. Keras and TensorFlow Keras.

github.com

위의 efficientnet keras의 깃헙에서 일부만 가져온 소스인데 return EfficientNet에 1, 2, 3번째 파라미터를 보면 순서대로 width, depth, resolution입니다. 크기에 따라 모두 맞춰 만들어졌기 때문에 모델에 따른 크기를 맞춰주는 것이 좋습니다.

def EfficientNetB0(
        include_top=True,
        weights='imagenet',
        input_tensor=None,
        input_shape=None,
        pooling=None,
        classes=1000,
        **kwargs
):
    return EfficientNet(
        1.0, 1.0, 224, 0.2,
        model_name='efficientnet-b0',
        include_top=include_top, weights=weights,
        input_tensor=input_tensor, input_shape=input_shape,
        pooling=pooling, classes=classes,
        **kwargs
    )


def EfficientNetB1(
        include_top=True,
        weights='imagenet',
        input_tensor=None,
        input_shape=None,
        pooling=None,
        classes=1000,
        **kwargs
):
    return EfficientNet(
        1.0, 1.1, 240, 0.2,
        model_name='efficientnet-b1',
        include_top=include_top, weights=weights,
        input_tensor=input_tensor, input_shape=input_shape,
        pooling=pooling, classes=classes,
        **kwargs
    )

 

 

댓글