- 1. Basic Vision Model
- [12′ NIPS] ImageNet Classification with Deep Convolutional Neural Networks (AlexNet) 핵심 리뷰
- [15′ CVPR] Going deeper with convolutions (GoogleNet, inception) 핵심 리뷰
- [15′ ICLR] VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION (VGGNet)
- [15′ ICML] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- [16′ CVPR] Deep Residual Learning for Image Recognition (ResNet)
- 2. Vision Model 응용 버전
- [16′ BMVC] Wide ResNet : Wide Residual Networks
- [17′ CVPR] Xception: Deep Learning with Depthwise Separable Convolutions
- [17′ ICLR] FRACTALNET: ULTRA-DEEP NEURAL NETWORKS WITHOUT RESIDUALS
- [17′ CVPR] Densely Connected Convolutional Networks (DenseNet)
- [17′ CVPR] Deep Pyramidal Residual Networks (PyramidNet)
- [17′ CVPR] Active Convolution: Learning the Shape of Convolution for Image Classification
- [17′ CVPR] Residual Attention Network for Image Classification
- [18′ CVPR] SENet : Squeeze and excitation networks
- [18′ BMVC] BAM: Bottleneck Attention Module
- [18′ ECCV] CBAM : convolutional block attention module
- [19′ CVPR] Selective Kernel Networks (SKNet)
- [19′ ICML] EfficientNet : Rethinking Model Scaling for Convolutional Neural Networks
- [21′ ICLR] Vision Transformer : AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
- [21′ NIPS] MLP-Mixer: An all-MLP Architecture for Vision
- [논문 리뷰] KAN: Kolmogorov–Arnold Networks
1. 들어가며
딥러닝 모델의 성능 향상은 지속적인 연구의 화두 중 하나입니다. 이를 위해 모델의 깊이(depth), 너비(width), 그리고 입력 이미지의 해상도(resolution)를 조정하는 다양한 방법들이 제안되어 왔습니다. 그러나 이 세 가지 요소를 동시에 조정하는 연구는 거의 없었고, 이로 인해 모델의 효율성과 성능 간의 균형을 찾는 것이 어려웠습니다. 이러한 배경 속에서 EfficientNet이라는 새로운 모델이 제안되었습니다. 이번 글에서는 EfficientNet의 핵심 아이디어와 구조, 그리고 그 성능에 대해 자세히 알아보겠습니다.
첫 번째 섹션에서는 기존의 방법들이 왜 효율적이지 않았는지를 깊이 있게 탐구합니다. 여기서는 기존 방법들의 한계와 이를 극복하기 위한 새로운 접근법의 필요성에 대해 설명합니다. EfficientNet은 이 문제를 해결하기 위해 Neural Architecture Search(NAS)를 사용하여 기본 모델을 생성하고, 이를 바탕으로 Compound Scaling 방법을 도입합니다. 이 방법은 모델의 Depth, Width, 그리고 Resolution을 동시에 조정하여 모델의 성능을 최적화합니다. 이 과정에서 어떻게 각 요소가 조정되는지, 그리고 이러한 조정이 모델의 성능에 어떻게 영향을 미치는지에 대해 자세히 알아보겠습니다.
두 번째 섹션에서는 EfficientNet의 제안 방법에 대해 더욱 깊게 탐구합니다. 여기에서는 Compound Scaling의 각 요소와 그들이 FLOPS에 미치는 영향에 대해 그림과 함께 쉽게 이해할 수 있도록 설명합니다. 또한, EfficientNet-B0에서 B7까지의 모델을 생성하는 과정도 자세히 살펴보겠습니다. 이 과정에서 EfficientNet의 각 버전이 어떻게 구성되는지, 그리고 각 버전의 성능과 특징은 어떻게 다른지에 대해 상세히 설명합니다.
세 번째 섹션에서는 EfficientNet의 구조를 파이썬 코드로 직접 구현해보며, 이론을 실제로 어떻게 적용하는지 학습합니다. 이를 통해 독자들은 EfficientNet의 작동 원리를 더욱 명확하게 이해할 수 있을 것입니다. 코드를 통해 모델의 각 부분이 어떻게 작동하는지, 그리고 이러한 구조가 왜 효과적인지에 대해 실질적으로 경험해볼 수 있습니다.
네 번째 섹션에서는 이미지넷 데이터셋에서의 실험 결과를 통해 EfficientNet의 성능을 다른 모델과 비교합니다. 이 결과를 통해 EfficientNet이 얼마나 효율적이고 성능이 우수한지를 확인할 수 있습니다. 다양한 모델과의 비교를 통해 EfficientNet의 상대적인 성능을 정량적으로 평가하며, 이를 통해 EfficientNet의 실제 성능을 객관적으로 이해할 수 있습니다.
마지막 섹션에서는 EfficientNet의 의의를 다룹니다. EfficientNet은 compound scaling 방법을 통해 모델의 효율성과 성능을 동시에 향상시키는 새로운 경로를 제시합니다. 이러한 접근 방법은 딥러닝 모델의 발전에 큰 영향을 미칠 것으로 기대됩니다. 또한, EfficientNet의 다양한 버전들은 다양한 상황과 요구사항에 맞게 사용될 수 있어, 매우 넓은 범위의 응용 분야에서 활용될 수 있습니다.
이 글을 통해 EfficientNet의 전반적인 구조와 원리, 그리고 그 성능에 대해 깊이 이해할 수 있을 것입니다. 이러한 이해를 바탕으로 여러분도 EfficientNet을 활용한 다양한 프로젝트와 연구에서 뛰어난 결과를 얻을 수 있기를 바랍니다.
2. 기존 방법의 문제점
이제 EfficientNet 논문에서 풀고자 했던 당시 기존 방법들의 문제점을 살펴보겠습니다. CNN에 영향을 주는 다양한 변수들이 존재합니다. 가장 대표적으로 Width, Depth, Resolution을 들 수 있습니다.
위 그림은 CNN의 연산 과정을 통해 Width, Depth, Resolution을 나타낸 그림입니다. 이때의 직사각형들은 CNN 연산 과정에서의 Feature Map을 의미합니다.
이제 Width, Depth, Resolution 각각의 의미를 살펴보겠습니다.
2-1. Width의 의미와 이에 대한 기존 연구들
먼저 Width는 각 Feature Map의 ‘채널수’를 의미합니다.
위 그림은 Width의 증가에 따른 ImageNet 성능을 나타낸 그래프입니다. 보통 Width가 증가함에 따라 모델의 성능은 증가한다고 말할 수 있습니다. Width가 증가할수록 Feature Map에서는 더 많은 채널정보를 포함하게 되죠. 채널 정보가 많을수록 더 많은 종류의 정보를 담을 수 있기에 성능이 좋아진다고 생각할 수 있습니다. 이러한 아이디어에 착안한 대표적인 연구로 Wide ResNet을 들 수 있습니다. Wide ResNet은 ResNet모델에서 Width만 넓어져도 성능이 개선됨을 보였죠.
2-2. Depth의 의미와 이에 대한 기존 연구들
다음으로 Depth는 모델의 깊이, 즉 ‘Layer의 개수’를 의미합니다. Depth가 깊다는 의미는 보통 해당 네트워크가 많은 수의 Layer를 갖고 있음을 의미하죠.
위 그림은 Depth에 따른 ImageNet 성능을 나타낸 그래프입니다. 일반적으로 위 그래프와 같이 Depth가 증가하면 모델의 성능은 증가한다고 말할 수 있습니다. Layer 개수가 많아질수록 모델의 연산량이 늘어나게 되죠. 따라서 더 많은 정보에 대해 연산을 수행할 수 있기에 성능이 증가한다고 생각할 수 있습니다. 하지만 Layer 개수가 많아진다고 해서 마냥 성능이 증가하지는 않습니다. 위 그래프에서도 일정 깊이 이상이 되면 성능이 포화되는 모습을 볼 수 있습니다. 학습 데이터셋에 비해 네트워크 용량이 너무 크면 학습 데이터셋에 최적화 돼버리는 과적합 현상이 발생하기 때문이죠. 이렇게 네트워크의 Depth에 대해 다룬 연구로는 대표적으로 ResNet과 Batch Normalization을 들 수 있습니다.
ResNet은 Residual Connection 방법을 사용하여 모델의 깊이를 획기적으로 깊게 만들 수 있었죠. Batch Normalization에서는 Covariate Shift 현상을 해결함으로써 안정적으로 모델의 깊이를 깊게 만들 수 있었습니다.
2-3. Resolution의 의미와 이에 대한 기존 연구들
다음으로 Resolution은 Input Image 그리고 Feature Map의 해상도를 의미합니다. 이때의 해상도란 Input Image 또는 Feature Map의 Width x Height 크기를 말합니다.
위 그림은 Resolution에 따른 ImageNet 성능을 나타낸 그래프입니다. 일반적으로 Resolution이 증가하면 모델의 성능은 증가한다고 말할 수 있습니다. 위와 비슷한 논리인데요. Resolution이 증가한다는 건 입력 정보가 많아진다는 것을 의미합니다. 당연히 모델 입장에서는 정보가 많아지니 유리해질 겁니다. 책 한 권만으로 공부하고 시험 봐야 하는 조건과 책 10권으로 공부하고 시험 봐야 하는 조건을 생각해 보죠. 어느 경우가 더 유리할까요? 당연히 더 많은 책으로 공부하는 경우가 시험 점수가 더 잘 나올 겁니다.
2-4. EfficientNet의 초점
지금까지 Width, Depth, Resolution이 네트워크의 성능에 미치는 영향과 각각의 대표적인 연구들에 대해 알아봤습니다. 각각의 Scale 변수들이 커질 때마다 네트워크의 성능이 좋아짐을 확인했죠. 그리고 각각의 변수들에 대해 초점을 맞춰 진행되는 연구들도 있고요.
그럼 EfficientNet 논문에서는 무엇이 문제라는 걸까요? EfficientNet이 주장하는 문제는, 이 세 가지 변수를 모두 고려한 연구가 없다는 점입니다.
위 그림은 EfficientNet 논문에서 표현하고 있는 Width, Depth, Resolution 변수들에 대한 표현입니다. 마지막에 Compound Scaling 방법으로 표현된 그림이 있는데요. 이는 Width, Depth, Resolution을 동시에 증가시키는 방법을 의미합니다. 아직까지 Width, Depth, Resolution을 어떻게 ‘체계적으로’ 증가시켜야 모델의 성능이 가장 ‘효율적으로’ 증가하는지에 대한 연구는 없었죠. 따라서 EfficientNet 논문은 이 부분에 초점을 맞춰 연구를 진행합니다.
3. 제안 방법
지금까지 EfficientNet 논문에서 해결하고자 했던 기존 방법의 문제점에 대해 살펴봤습니다. 이번 챕터에서는 위의 문제를 해결하기 위한 EfficientNet의 제안 방법을 살펴보겠습니다.
본격적으로 살펴보기 전에 EfficientNet 논문의 목표를 정리해 보겠습니다. EfficientNet 논문의 목표는 크게 두 가지로 나누어볼 수 있습니다.
첫 번째는 위에서 언급한 문제를 해결하기 위한 최적의 Compound Scale Up 방법을 찾는 것입니다. 즉 Width, Depth, Resolution을 동시에 그리고 가장 효율적으로 증가시켜 모델의 성능을 올리는 방법을 찾는 것이죠. 이 목표에 대한 논문의 내용을 살펴보겠습니다.
먼저 딥러닝 모델의 연산을 수식으로 다음과 같이 표현할 수 있습니다.
- F : i번째 Layer에서의 연산
- x : Input Data
딥러닝 모델의 성능을 개선하기 위한 방법은 다양합니다. 가장 대표적으로 새로운 Architecture를 찾는 방법이 있죠. 예를 들어 Inception, VGGNet, ResNet 등의 연구들이 이에 해당합니다. 이러한 연구는 위의 수식에서 새로운 F를 찾는 방법이라고 생각할 수 있습니다. 어떻게 연산해야 모델의 성능이 가장 좋아지는지를 연구하는 것이죠.
반면 Architecture는 고정한 채로 최적의 Scale을 연구하는 방법이 있습니다. 위에서 언급한 Wide ResNet과 깊이에 대한 영향을 연구한 ResNet 등이 이에 해당합니다. EfficientNet 연구에서는 후자에 집중합니다. 즉 동일한 Architecture에서 가장 최고의 성능을 내는 Scale Up 방법을 찾는데에 집중합니다. 이를 수식으로는 다음과 같이 표현할 수 있습니다.
위 수식은 이렇게 해석할 수 있습니다. 딥러닝 모델의 성능 (Accuracy)를 최대로 (Max)하는 방법을 찾을 건데요. 이때의 딥러닝 연산은 위에서 보았듯 함수 F와 Width, Depth, Resolution 등의 변수가 있습니다. 그리고 목표 메모리와 목표 연산량보다는 적다는 조건을 만족해야 합니다.
두 번째는 위에서 찾은 최적의 Scale Up 방식으로 만든 가장 효율적인 네트워크를 제안하는 것입니다. 이렇게 찾은 네트워크의 이름이 바로 EfficientNet이죠. EfficientNet은 다양한 Scale에 따라 여러 종류로 표현할 수 있습니다.
이제 EfficientNet 논문의 제안 방법을 하나씩 자세히 살펴보겠습니다.
3-1. 최적의 Compound Scale Up 방법
먼저 최적의 Compound Scale Up 방법에 대해 살펴보겠습니다. 즉 이번 챕터는 다른 네트워크에도 적용하여 가장 효율적으로 Compound Scale Up 방법을 찾는데에 집중합니다. Scale Up에 영향을 주는 변수로는 Width, Depth, Resolution 세 가지에 집중합니다. 문제는 이 Width, Depth, Resolution의 비율은 어떻게 정해줄까요? 우리의 목표는 동일한 FLOPS에서 최적의 Width, Depth, Resolution를 찾는 것이죠. 그렇다면 Width, Depth, Resolution 각각이 FLOPS에 미치는 영향을 생각해 보죠.
3-1-1. Depth
먼저 Depth입니다.
위 그림은 Depth의 증가에 따른 FLOPS의 변화를 표현한 그림입니다. 먼저 왼쪽에서는 Depth가 𝛼배 증가된 모습을 표현하고 있습니다. 하나의 Convolution Layer가 늘어난 모습이네요. 오른쪽에서는 이때의 Convolution Filter 개수를 표현하고 있습니다. Convolution Layer가 𝛼배 늘어나면 동일하게 FLOPS도 𝛼배가 늘어난다는 것을 알 수 있습니다.
3-1-2. Width
다음은 Width입니다.
위 그림은 Width 증가에 따른 FLOPs의 변화를 표현한 그림입니다. 먼저 왼쪽에서는 Width가 𝛽배 늘어난 모습을 표현하고 있습니다. Feature Map의 채널수가 𝛽배만큼 늘어난 모습이네요. 하지만 Depth랑 달리 Width는 이후 Feature Map에도 영향을 미치는데요. 두 번째 Feature Map에서는 𝛽^2 만큼 커진 모습을 볼 수 있습니다. 오른쪽에서는 이때의 Convolution Filter 개수를 표현하고 있습니다. FLOPS도 마찬가지로 𝛽와 𝛽^2배로 각각 커진 모습을 볼 수 있습니다. 따라서 Width가 𝛽배 증가하면 FLOPS는 𝛽^2배만큼 커진다는 것을 알 수 있습니다.
3-1-3. Resolution
다음은 Resolution입니다.
위 그림은 Resolution 증가에 따른 FLOPS의 변화를 표현한 그림입니다. 먼저 왼쪽에서는 Resolution이 𝛾배 늘어난 모습을 표현하고 있습니다. 이때의 Resolution은 Input Image 또는 Feature Map의 Width와 Height를 의미합니다. 따라서 Width과 Height가 각각 𝛾배가 늘어나므로 Feature Map의 크기는 𝛾^2배가 늘어나겠죠. 이에 따라 Convolution으로 연산해야 되는 FLOPS는 𝛾^2배가 늘어날 겁니다.
3-1-4. 종합
결론적으로 FLOPS는 Depth, Width^2, Resolution^2에 비례한다고 할 수 있습니다. 이를 수식으로 표현하면 다음과 같습니다.
Depth는 가중치 𝛼에, Width는 가중치 𝛽에, Resolution은 가중치 𝛾에 비례하는 모습을 볼 수 있습니다. 이때 𝛼 x 𝛽^2 x 𝛾^2은 일정한 값을 유지해야 합니다. FLOPS를 일정하게 유지해야 하니까요. 이 상태에서 최적의 𝛼, 𝛽, 𝛾를 구해야 합니다. 이걸 어떻게 구할 수 있을까요? EfficientNet 논문에서는 Small Grid Search로 최적의 𝛼, 𝛽, 𝛾 값을 찾습니다. 대단한 방법은 아니고요. 𝛼 x 𝛽^2 x 𝛾^2를 만족하는 다양한 경우의 𝛼, 𝛽, 𝛾 조합이 있겠죠. 이 조합들로 일일이 모델을 만들어 성능을 측정해 보고 가장 성능이 좋은 조합을 선택한다는 의미입니다.
3-2. EfficientNet
지금까지 최적의 Compound Scale Up 방법을 살펴봤습니다. 이제 이 방법을 적용하여 가장 효율적인 네트워크를 만들어보겠습니다.
3-2-1. Baseline Model 만들기
우선 Compound Scale Up을 적용하기 전에 Baseline 모델을 만들어야겠죠. EfficientNet 논문에서는 이를 위해 Neural Architecture Search (NAS) 방법을 사용합니다. NAS는 쉽게 말해 딥러닝을 사용하여 딥러닝 모델을 찾는 방법입니다. 딥러닝 방법을 사용한다는 건 목적 함수를 정해주고 Backpropagation을 통해 학습할 수 있다는 것을 의미하죠.
위 그림은 NAS를 사용하여 Baseline 모델을 찾는 과정을 표현한 그림입니다. NASNet이라는 딥러닝 모델이 있다고 생각해 볼게요. 이 모델은 Output으로 모델의 구조가 나옵니다. 예를 들어 Convolution Block은 어떻게 구성할 것인지, Attention 기능을 넣을 것인지, 몇 층 깊이로 만들 것인지 등등이 나오죠. 이렇게 나온 결과대로 만든 모델을 Baseline 모델이라고 하겠습니다.
이제 이 모델로 성능을 측정해 봅니다. 그럼 모델의 성능 (Accuracy)와 연산량 (FLOPS)가 나오겠죠. 우리의 목표는 연산량 대비 성능이 가장 좋은 모델을 찾는 것입니다. 이를 NASNet의 Loss Function으로 설정할 거예요. 이제 NASNet의 학습을 진행합니다. 학습이 완료되면 다시 NASNet이 Baseline 모델을 제안하겠죠. 이 과정을 반복하는 겁니다. 이렇게 NASNet을 학습하여 얻은 모델을 Baseline 모델로 정합니다.
3-2-2. Compound Scale Up 적용하기
이제 Compound Scale Up 방법을 적용하여 Depth, Width, Resolution을 찾을 차례입니다. 위에서 Depth, Width, Resolution의 조합은 Small Grid Search 방법으로 찾는다고 했는데요. Baseline 모델에 적용한 Small Grid Search 결과는 다음과 같습니다.
다양한 𝛼, 𝛽, 𝛾 조합이 있었고, 이때 𝛼=1.2, 𝛽=1.1, 𝛾=1.5일 때 성능과 연산량을 고려한 성능이 가장 높았습니다. 이제 Baseline 모델에 적용할 Depth, Width, Resolution이 정해졌으니 최종 네트워크가 완성되었습니다. 이렇게 나온 네트워크를 EfficientNet-B0라고 합니다.
위 그림은 EfficientNet-B0의 구성을 나타낸 표입니다. 이때 앞쪽의 Operator에 해당하는 부분은 NAS로 찾고 뒤쪽의 Depth, Width, Resolution 부분은 Small Grid Search로 찾은 것입니다. 이제 EfficientNet의 양산틀이 정해진 셈인데요. 여기서 더 큰 EfficientNet을 만드는 방법은 간단합니다. 위의 비율을 고정한 채로 Scale만 키워주면 됩니다.
위 그림은 EfficientNet의 Scale Up 방법을 나타낸 표입니다. 𝛼, 𝛽, 𝛾의 값은 고정된 모습을 볼 수 있습니다. 그리고 𝜙값만 순차적으로 증가시켜 가며 EfficientNet의 Scale Up을 진행하는 모습입니다. 이렇게 나온 Scale Up 된 EfficientNet을 EfficientNet-B1 ~ EfficientNet-B7이라고 합니다.
3-2-3. 종합
지금까지 EfficientNet 논문의 제안 방법을 살펴봤습니다.
크게 두 가지로 나누어 살펴봤는데요.
첫 번째는 가장 효율적으로 모델의 Compound Scale Up을 진행하는 방법입니다. 이는 EfficientNet에 국한되지 않고 사용할 수 있는 방법이죠.
두 번째는 위의 Compound Scale Up과 NAS 방법을 사용하여 만든 가장 효율적인 네트워크인 EfficientNet입니다. EfficientNet은 B0부터 B7까지 다양한 Scale로 구성할 수 있습니다.
4. 파이썬 구현
이번 챕터에서는 파이썬을 사용하여 직접 EfficientNet을 구현해 보겠습니다. 이 과정을 통해 EfficientNet 구조를 정확하게 파악해보겠습니다.
4-1. Import Module
먼저 필요한 Module 들을 Import 해줍니다.
import torch
import torch.nn as nn
import torch.nn.functional as F
4-2. MBConv Block Class 정의하기
EfficientNet을 구성해는 핵심 모듈은 MBConv Block인데요. 이는 MobileNetv2에서 제안된 블럭입니다. 먼저 MBConvBlock Class를 정의해줍니다.
class MBConvBlock(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride, expand_ratio):
super(MBConvBlock, self).__init__()
hidden_dim = in_channels * expand_ratio
self.expand = in_channels != out_channels
self.block = nn.Sequential(
# Pointwise Convolution
nn.Conv2d(in_channels, hidden_dim, 1, 1, 0, bias=False),
nn.BatchNorm2d(hidden_dim),
nn.ReLU6(inplace=True),
# Depthwise Convolution
nn.Conv2d(hidden_dim, hidden_dim, kernel_size, stride, kernel_size//2, groups=hidden_dim, bias=False),
nn.BatchNorm2d(hidden_dim),
nn.ReLU6(inplace=True),
# Pointwise Convolution Linear
nn.Conv2d(hidden_dim, out_channels, 1, 1, 0, bias=False),
nn.BatchNorm2d(out_channels),
)
def forward(self, x):
if self.expand:
return self.block(x)
else:
return x + self.block(x)
4-3. EfficientNet Class 정의하기
이제 MBConvBlock을 이어붙여 EfficientNet을 정의해줍니다. 이 코드에서는 EfficientNet B0의 구성에 맞게 구성했습니다.
class EfficientNet(nn.Module):
def __init__(self):
super(EfficientNet, self).__init__()
self.stem = nn.Sequential(
nn.Conv2d(3, 32, 3, 2, 1, bias=False),
nn.BatchNorm2d(32),
nn.ReLU6(inplace=True)
)
self.blocks = nn.Sequential(
MBConvBlock(32, 16, 3, 1, 1),
MBConvBlock(16, 24, 3, 2, 6),
MBConvBlock(24, 40, 5, 2, 6),
MBConvBlock(40, 80, 3, 2, 6),
MBConvBlock(80, 112, 5, 1, 6),
MBConvBlock(112, 192, 5, 2, 6),
MBConvBlock(192, 320, 3, 1, 6)
)
self.head = nn.Sequential(
nn.Conv2d(320, 1280, 1, 1, 0, bias=False),
nn.BatchNorm2d(1280),
nn.ReLU6(inplace=True),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(1280, 1000)
)
def forward(self, x):
x = self.stem(x)
x = self.blocks(x)
x = self.head(x)
return x
4-4. EfficientNet 사용하기
이렇게 정의된 EfficientNet은 아래와 같이 사용할 수 있습니다.
# Create the model
model = EfficientNet()
5. 효과
이번 챕터에서는 위에서 살펴본 EfficientNet 논문 제안 방법의 효과를 실험 결과를 통해 살펴보겠습니다.
크게 세 가지로 나누어 살펴보겠습니다.
먼저 EfficientNet에서 제안한 Compound Scale Up 방법의 효과를 살펴봐야겠죠.
두 번째로 EfficientNet의 Image Classification 성능을 다른 모델과 비교해 보겠습니다.
마지막으로 Transfer Learning 성능을 비교해 보겠습니다.
5-1. Compound Scale Up 방법의 효과
먼저 기존의 Scale Up 방법과 EfficientNet의 Compound Scale Up 방법의 성능을 비교해 보겠습니다.
위 표는 MobileNet과 ResNet을 Scale Up 했을 때의 FLOPS와 성능을 측정한 표입니다. 기존 Scale Up 방법과 EfficientNet의 Compound Scale Up 방법의 성능을 비교할 수 있는데요. 동일한 FLOPS를 갖도록 Scale Up 했을 때 EfficientNet의 Compound Scale Up 방법의 성능이 가장 좋은 모습을 알 수 있습니다. 이 실험을 통해 EfficientNet에서 제안한 Compound Scale Up 방법의 효과를 확인할 수 있습니다.
5-2. EfficientNet Image Classification 성능
다음은 모델의 성능을 측정하는 대표적인 방법인 Image Classification 성능을 통해 EfficientNet의 성능을 비교해 보겠습니다.
위 그림은 EfficientNet과 다양한 모델의 ImageNet 데이터셋에 대한 성능입니다. 파라미터 개수와 FLOPS에 따른 성능을 비교할 수 있는데요. 대략적으로 EfficientNet의 성능이 가장 좋다는 건 알 수 있습니다. 표로는 직관적으로 확인이 안 되니 그래프로 살펴보죠.
위 그림의 왼쪽은 파라미터 개수에 따른 성능을 비교한 그래프입니다. 한눈에 봐도 EfficientNet이 동일한 파라미터 개수 대비 가장 성능이 좋음을 알 수 있습니다.
오른쪽 그림은 FLOPS에 따른 성능을 비교한 그래프입니다. 마찬가지로 EfficientNet이 동일한 FLOPS 대비 가장 성능이 좋음을 알 수 있습니다.
5-3. EfficientNet Transfer Learning 성능
다음은 Transfer Learning 실험 결과를 살펴보겠습니다.
위 그림은 다양한 데이터셋에 대한 다양한 모델들의 Transfer Learning 성능을 비교한 표입니다. 기존 학습한 데이터셋은 ImageNet이고 이를 다양한 데이터셋에 대해 Transfer Learning 한 성능을 비교하고 있습니다. 이렇게 표로 봐서는 마찬가지로 감이 오지 않으니 그래프로 성능을 비교해 보겠습니다.
위 그림은 다양한 데이터셋에 대한 다양한 모델의 Transfer Learning 성능을 비교한 그래프입니다. 한눈에 봐도 모든 데이터셋에서 EfficientNet의 성능이 다른 모델들보다 훨씬 좋은 모습을 알 수 있습니다.
여기까지 총 세 개의 실험 결과를 살펴봤습니다.
첫 번째 실험 결과를 통해 EfficientNet이 제안한 Compound Scale Up 방식이 기존 방식보다 효과적임을 확인했습니다.
두 번째 실험 결과에서는 ImageNet 데이터셋에 대한 성능을 보았습니다. 이를 통해 동일 연산량의 모델과 비교했을 때 EfficientNet의 성능이 가장 좋음을 확인했습니다.
세 번째 실험 결과에서는 Transfer Learning 성능을 보았습니다. 이를 통해 동일 연산량의 모델과 비교했을 때 EfficientNet의 성능이 가장 좋음을 확인했습니다.
6. 의의
다음으로 EfficientNet 논문의 의의에 대해 살펴보겠습니다.
첫 번째 의의는 Compound Scaling 방식을 제안했다는 것입니다. EfficientNet은 Compound Scaling이라는 새로운 방법을 도입하여 모델의 성능을 향상시킵니다. 대부분의 네트워크는 네트워크의 깊이, 너비, 또는 입력 이미지의 해상도 중 하나만을 조정하는데, EfficientNet은 이 세 가지 요소를 동시에 조정합니다. 이로 인해 모델은 더 적은 파라미터와 연산량으로 높은 성능을 달성할 수 있습니다.
두 번째 의의는 효율성과 정확도의 균형이 잘 잡힌 네트워크를 제안했다는 점입니다. EfficientNet은 모델의 크기와 정확도, 그리고 연산 속도 사이의 균형을 매우 잘 맞춥니다. 이는 다양한 환경과 애플리케이션에서 사용할 수 있도록 만들어주며, 특히 자원이 제한된 환경에서 매우 유용합니다.
이 두 가지 의의는 EfficientNet이 단순히 성능을 향상시키는 것을 넘어, 딥러닝 모델을 더 효율적으로 설계할 수 있는 새로운 방법론을 제시한다는 점에서 매우 중요합니다.
7. 마치며
이 글을 통해 EfficientNet의 근본적인 아이디어와 구조, 그리고 성능에 대해 깊이 있게 탐구해보았습니다. EfficientNet은 기존의 딥러닝 모델 설계 방법에 혁신을 가져다주며, 모델의 깊이, 너비, 그리고 해상도를 동시에 조정하는 Compound Scaling 방법을 도입하여 모델의 성능과 효율성을 동시에 향상시킬 수 있게 하였습니다. 이러한 방법은 모델의 성능을 최적화하는 데 큰 도움이 될 것입니다.
우리는 또한 EfficientNet의 다양한 버전들과 그들의 특징에 대해 자세히 알아보았습니다. 각 버전은 특정 상황과 요구사항에 따라 최적화되어 있어, 다양한 응용 분야에서 효과적으로 사용될 수 있습니다. 이러한 다양한 버전들은 여러분의 프로젝트와 연구에 유용하게 활용될 수 있을 것입니다.
또한, 파이썬 코드를 통해 EfficientNet의 구조를 직접 구현해보며, 이론과 실제를 연결하는 중요한 경험을 하였습니다. 이를 통해 EfficientNet의 작동 원리와 구조를 더욱 철저하게 이해할 수 있게 되었습니다. 이러한 실질적인 경험은 여러분이 EfficientNet을 자신의 프로젝트에 효과적으로 적용하는 데 큰 도움이 될 것입니다.
이미지넷 데이터셋에서의 실험 결과를 통해, EfficientNet이 다른 모델들에 비해 얼마나 우수한 성능을 보이는지도 확인할 수 있었습니다. 이러한 결과는 EfficientNet의 성능을 객관적으로 평가하는 데 중요한 근거를 제공합니다.
마지막으로, EfficientNet의 의의에 대해 다시 한번 강조하고자 합니다. EfficientNet은 모델의 효율성과 성능을 동시에 향상시키는 새로운 방법을 제시하며, 이는 딥러닝 모델의 발전에 큰 기여를 하게 될 것입니다. 이러한 이유로 EfficientNet은 앞으로도 지속적으로 주목받고 연구되며, 다양한 분야에서 활용될 것으로 예상됩니다.
이 글을 마치며, 여러분도 EfficientNet을 활용하여 뛰어난 성능의 모델을 구축하고, 다양한 문제를 효과적으로 해결할 수 있기를 바랍니다. EfficientNet의 효율적이고 강력한 구조가 여러분의 연구와 프로젝트에 새로운 가능성을 열어줄 것입니다.