EfficientNet 구현

조성운·2022년 11월 8일

가상환경 세팅

conda create --name efficient python=3.7

conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch

pip install timm
pip install timm
pip install matplotlib
pip install pandas
conda install scikit-learn

Model Import

  • pip install efficient_pytorch
  • timm
  • torchvision.models.efficientnet

model을 불러오는 모듈 및 패키지는 3가지 존재한다. efficient_pytorch 패키지의 경우 v2 버전을 제공하지 않기 때문에 timmtorchvision 을 통해 불러오는 것을 추천한다.

from torchvision.models import efficientnet_v2_s
conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch

import Error

  • torchvision 버전에 따라 import가 안되는 경우가 있다.
  • 가장 최신의 torchvision을 설치하거나, efficientnet이 제공되는 버전을 설치한다.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'efficientnet_v2_s'

torchvision.models 에서 제공하는 efficientnet 버전

  • 본 포스팅에서는 efficientnet_v2_s를 예시로 사용한다.
# Version 1
efficientnet_b0
efficientnet_b1
efficientnet_b2
efficientnet_b3
efficientnet_b4
efficientnet_b5
efficientnet_b6
efficientnet_b7

# Version2
efficientnet_v2_s
efficientnet_v2_m
efficientnet_v2_l

Model Load

# ImageNet V1으로 사전학습된 가중치 탑재
model = efficientnet_v2_s(weights='IMAGENET1K_V1')

# summary
import torchsummary
torchsummary.summary(model, (3, 512, 512), device='cpu')

fc.layer 변경

  • 모델 마지막 단의 fc.layer를 원하는 class 수에 맞게 변경한다.
  • 본 포스팅에서는 class 수를 2로 설정한다.

EfficientNet의 classifier에 접근

  • torchvision.models로 불러온 모델의 경우 .을 통해 () 안에 있는 레이어에 접근이 가능하다.

  • 예를 들어 위 사진의 경우 EfficientNet의 구조이며 (classifier)Linear() 레이어에 접근할 경우 다음과 같이 코드를 작성하면 된다.
model.classifier[1]

  • class 개수가 2인 경우를 처리하기 위해 out_features는 2로 설정한다. in_features의 경우 기존의 fc.layer와 동일하게 구성한다.
in_features = model.classifier[1].in_features

model.classifier[1] = nn.Linear(in_features, out_features=2, bias=True)

Dropout 적용

버전 별 구조

# efficientnet_v2_s
(features)
  Sequential(
  (0) : Conv2dNormActivation()
  (1) : Sequential()
  (2) : Sequential()
  (3) : Sequential()
  (4) : Sequential()
  (5) : Sequential()
  (6) : Sequential()
  (7) : Conv2dNormActivation()
  )
(avgpool)
(classifier)

efficientnet_v2_s

drop_ratio = 0.2

for idx in range(len(models.features)):
  models.features[idx] = nn.Sequential(
                          models.features[idx],
                          nn.Dropout(drop_ratio)
                   		)
profile
DL 관련 공부 중입니다

0개의 댓글