Search

EfficientNet & MobileNet

대분류
인공지능/데이터
소분류
ML/DL 정리 노트
유형
딥 러닝
부유형
Vision PyTorch
최종 편집 일시
2024/10/27 15:20
생성 일시
2024/10/11 07:25
14 more properties

EfficientNet 설명

한정된 자원으로 최대의 효율을 내기 위한 방법으로 model scaling(depth, width, resolution)의 크기를 조절한다.
기존에는 이 세 가지를 수동으로 조절하였다면, EfficientNet은 model scaling 방법으로 compound scaling 방법을 제안
이 방법을 통해 기존 ConvNet보다 8.4배 작으면서, 6.1배 빠르고 더 높은 정확도를 갖는다.

torchvision.models.efficientnet_b0

features: A collection of layers
avgpool: features layers의 결과값을 평균하여 feature vector로 변환
classifier: feature vector를 최종 결과를 나타내는 output classes vector로 변환
Summary
# Print a summary using torchinfo (uncomment for actual output) summary(model=efficientnet_model, input_size=(32, 3, 224, 224), # make sure this is "input_size", not "input_shape" # col_names=["input_size"], # uncomment for smaller output # trainable -> requires_grad col_names=["input_size", "output_size", "num_params", "trainable"], col_width=20, row_settings=["var_names"] )
Python
복사

FineTuning

output layer 변경
학습용 layers들은 고정을하여 더 이상 학습을 하지 않도록 하고, 마지막 결과를 내보내는 output layer만 추가 학습을 시켜 변경시키는 방법
The process of transfer learning usually goes: freeze some base layers of a pretrained model(typicall the features section) and then adjust the output layers (also called head/classifier layers) to suit your needs.
features의 layers는 더이상 학습을 하지 않도록 고정!
code
# Freeze all base layers in the "features" section of the model (the feature extractor) by setting requires_grad=False for param in efficientnet_model.features.parameters(): param.requires_grad = False # Print a summary using torchinfo (uncomment for actual output) summary(model=efficientnet_model, input_size=(32, 3, 224, 224), # make sure this is "input_size", not "input_shape" # col_names=["input_size"], # uncomment for smaller output # trainable -> requires_grad col_names=["input_size", "output_size", "num_params", "trainable"], col_width=20, row_settings=["var_names"] ) # -- 기존 classifier는 1000개의 사물을 구분하게 하는 로직 -- # (classifier): Sequential( # (0): Dropout(p=0.2, inplace=True) # (1): Linear(in_features=1280, out_features=1000, bias=True) # 이것을 pizza, steak, sushi를 구분할 수있게 수정하고 학습을 시키면 된다. # Set the manual seeds torch.manual_seed(42) torch.cuda.manual_seed(42) # Get the length of class_names (one output unit for each class) output_shape = len(class_names) # Recreate the classifier layer and seed it to the target device efficientnet_model.classifier = torch.nn.Sequential( torch.nn.Dropout(p=0.2, inplace=True), torch.nn.Linear(in_features=1280, out_features=output_shape, # same number of output units as our number of classes bias=True)).to(device) # Summary # # Do a summary *after* freezing the features and changing the output classifier layer (uncomment for actual output) summary(efficientnet_model, input_size=(32, 3, 224, 224), # make sure this is "input_size", not "input_shape" (batch_size, color_channels, height, width) verbose=0, col_names=["input_size", "output_size", "num_params", "trainable"], col_width=20, row_settings=["var_names"] ) # Total params: 4,011,391 # Trainable params: 3,843 # Non-trainable params: 4,007,548 # Total mult-adds (G): 12.31 # ================= # Forward/backward pass size (MB): 3452.09 # Params size (MB): 16.05 # Estimated Total Size (MB): 3487.41
Python
복사
생각해보자:
Trainable column: feature layers는 변경되지 않고 학습에 대한 부분만(requires_grad=False) 변경되었다.
Output shape of classifier: 결과 모양이 [32, 1000]에서 [32, 3]으로 변경되었다. 또한 학습을 진행하는 것으로 표현되어 있다.
Less trainable parameter: 기존 학습용 파라미터 수가 5,288,548에서 4,007,548로 줄어들었다.
MobileNet 모델의 key idea는 Depth-wise Separable Convolution을 통해 연산량을 줄였다.
따라서 다른 기존 모델보다 layers는 많지만 전체 연산량을 획기적으로 줄임으로써 고성능이 아닌 환경에서도 작동할 수 있는 알고리즘

MobileNet의 필요성

고성능의 환경

데이터 센터 환경에서는 고성능의 CPU가 매우 많이 있기 때문에 연산 처리 성능이 매우 고성능이고, 고성능의 그래픽 카드(GPU) 다수를 가지고 있을 수 있으며, 메모리도 대용량을 사용할 수 있다.
또한 전력 공급이 지속적으로 이루어지기 때문에 전원을 아끼기 위해 성능을 낮추는 것 보다는 더 높은 퍼포먼스에 초점을 두는 경우가 많다.
이런 컴퓨터 환경에서는 어떤 모델을 넣더라도 잘 작동을 할 것

고성능이 아닌 환경

실생활에서 사용하는 AI 서비스들은 데이터 센터 또는 슈퍼 컴퓨터보다는 자동차, 드론, 스마트폰과 같은 환경에서 잘 작동이 되어야 하는 경우가 많아지고 있다.
이런 저성능의 환경에서 잘 작동할 수 있으며, 성능도 보장이되어야 하는 요구들이 늘어나면서 딥러닝 모델 경량화(MobileNet) 알고리즘이 발전하게 되었다.

MobileNet 설명

CNN(Standard Convolution) 연산량
MobileNet(Depth-wise Separable Convolution) 연산량
Depthwise Convolution 연산량
Pointwise Convolution 연산량

MobileNet과 다른 알고리즘과 효율 비교