heojae / FoodImageRotationAdmin

Food Image Rotation (음식이미지 회전) 이라는 주제에 대해서. 실제로 딥러닝(deeplearning)을 어떻게 도입하고, 이를 API(backend)로서 서버에 올리며, 웹(frontend) 를 통해서 올리는 과정을 구현하기 위해서 만든 프로젝트입니다.
0 stars 0 forks source link

[DeepLearning] 딥러닝 모델의 선택이유 #4

Open heojae opened 3 years ago

heojae commented 3 years ago

대주제 : 학습 시킬 모델을 정하고 싶다.

소주제 : Efficient Net 을 선택하게 된 배경과 그 이유를 정리하고 싶다.

모델선정

데이터의 분류와 클래스 선정의 이유 정리

위 링크에서 확인할 수 있듯이, 아래 두가지를 결정하였습니다.

딥러닝 모델의 용도 : Classification

데이터의 Class 종류 : Class => [0, 90, 180, 270]

결론

우선, 모델의 크기가 제일 작은 efficient-b0 모델을 선택하여, 구현할 예정입니다.

추후 성능을 증가하고 싶을 경우, 모델의 크기를 늘려, 구현하는 것을 추천 드립니다.

실험적으로, b0 - b7 까지, Colab 을 통해서, 돌려 보았고, 각각의 Inference Time 을 확인할 수 있었습니다.

이를 기반으로, 분석하였을 떄, 만약 성능과 inference time 을 교환한다면 B4 정도까지 추천드립니다.

그 이후의 경우, inference time 이 너무 증가하게 되기에, API 로서는 추천 드리지 않습니다.

또한, Mutlmodal Cnn 형태로 구현할 경우는 연산해야하는 것이 거의 배가 되기 때문에, inference time 또한 많이 느려지게 됩니다.

이를 참고하여, 구현하는 것이 좋을 것입니다.

heojae commented 3 years ago

efficientnet-b0 모델 용량

import torch
import torch.nn as nn
from torchsummary import summary

from efficientnet_pytorch import EfficientNet

class FiraEfficientNet(nn.Module):
    def __init__(self, first_train=True):
        super(FiraEfficientNet, self).__init__()
        self.fc_input = 1280
        self.fc_output = 4

        if first_train:
            self.model = EfficientNet.from_pretrained('efficientnet-b0')
        else:
            self.model = EfficientNet.from_name('efficientnet-b0')

        self.model._fc = nn.Linear(in_features=self.fc_input, out_features=self.fc_output, bias=True)

    def forward(self, x):
        x = self.model(x)
        return x

model = FiraEfficientNet(first_train=False)
summary(model, (3, 224, 224))

from torchsummary import summary 이게 완벽한 라이브러리는 아니겠지만,

위의 모델에서 summary 를 통해 추론할 경우,

스크린샷 2021-02-07 오후 12 30 16

인것을 확인 할 수 있었습니다.

그리고, 논문 기반의 결과로 보았을 때,

스크린샷 2021-02-07 오후 12 34 12

FC layer, output class 의 수정을 통해서, 기존의 논문에 나온 결과보다 더 적은 양의 Model Parameter 가 나온것을 확인할 수 있었습니다.